Цепочка работает так, что каждый из этих методов возвращает объект, у которого следующий метод является свойством. Это означает, что вы можете использовать что-то вроде reduce()
, чтобы продолжать вызывать следующий метод для объекта, возвращенного из предыдущего.
reduce()
принимает исходный объект, который вы можете передать, чтобы все пошло на смену. Примерно так:
var tables = ["table1","table2","table3"]
let res = tables.reduce((res, table) => res.innerJoin(table), db.select(fields).from(table))
Чтобы понять, как это работает, мы можем создать поддельный объект db
со всеми методами, которые возвращают объект для следующего метода в цепочке. Метод innerJoin
просто добавляет аргумент в свойство value:
// fake db object with these methods
const db = {
select(t) {
this.val = [] // initialize val
return this
},
from(t) {
return this
},
innerJoin(name) {
this.val.push("Added: " + name)
return this
}
}
var tables = ["table1","table2","table3"]
// call innerjoin for each of the tables
// this is the same as chaining them
let res = tables.reduce((res, table) => res.innerJoin(table), db.select().from())
// values where accumlated in the val property
console.log(res.val)
Я не думаю, что это возможно с C++ 98. Базовое представление перечислений до компилятора. В этом случае Вы - более обеспеченное использование:
const __int64 LARGE_VALUE = 0x1000000000000000L;
С C++ 11, возможно использовать классы Enum для определения базового типа перечисления:
enum class MY_ENUM : unsigned __int64 {
LARGE_VALUE = 0x1000000000000000ULL
};
, Кроме того, классы Enum представляют новый объем имени. Таким образом вместо того, чтобы обратиться к LARGE_VALUE
, Вы сослались бы MY_ENUM::LARGE_VALUE
.
C++ 11 поддержек это, с помощью этого синтаксиса:
enum class Enum2 : __int64 {Val1, Val2, val3};
Ответы, относящиеся к __int64
, пропускают проблему. Перечисление допустимо во всех компиляторах C++, которые имеют истинный целочисленный тип на 64 бита, т.е. любой C++ 11 компиляторов или C++ 03 компилятора с соответствующими расширениями. Расширения C++ 03 как __int64
работа по-другому через компиляторы, включая ее пригодность как базовый тип для перечислений.
Так как Вы работаете в C++, другая альтернатива могла бы быть
const __int64 LARVE_VALUE = ...
, Это может быть указано в файле H.
Ваш snipplet кода не является стандартом C++:
перечислимый MY_ENUM: неподписанный __ int64
не имеет смысла.
константа использования __ int64 вместо этого, как Torlack предполагает
Если компилятор не поддерживает перечисления на 64 бита флагами компиляции или какими-либо другими средствами, я думаю, что нет никакого решения этого.
Вы могли создать что-то как в Вашем образце что-то как:
namespace MyNamespace {
const uint64 LARGE_VALUE = 0x1000000000000000;
};
и использование его точно так же, как перечисление с помощью
MyNamespace::LARGE_VALUE
или
using MyNamespace;
....
val = LARGE_VALUE;
Перечисление в C++ может быть любым целочисленным типом. У Вас может, например, быть перечисление символов. IE:
enum MY_ENUM
{
CHAR_VALUE = 'c',
};
я был бы принимать , это включает __ int64. Попробуйте всего
enum MY_ENUM
{
LARGE_VALUE = 0x1000000000000000,
};
По словам моего комментатора, sixlettervariables, в C базовый тип будет интервалом всегда, в то время как в C++ базовый тип - то, что является достаточно большим для установки самому большому включенному значению. Таким образом, оба перечисления выше должны работать.
В MSVC ++ вы можете сделать это:
enum MYLONGLONGENUM: __ int64 {BIG_KEY = 0x3034303232303330, ...};
Текущий проект так называемого C ++ 0x , это n3092 , говорится в 7.2 Объявления перечисления , параграф 6:
Это реализация -определено, какой интегральный тип используется в качестве базового типа , за исключением того, что базовый тип не должен быть больше , чем int, если только значение {{1} }} перечислитель не может поместиться в int или unsigned int.
В том же абзаце также говорится:
Если никакой интегральный тип не может представлять все значения перечислителя, перечисление имеет неправильный формат.
Моя интерпретация части , если значение перечислителя не может поместиться в int или unsigned int , заключается в том, что вполне допустимо и безопасно инициализировать перечислитель с 64-битным целочисленным значением, пока существует 64 -битовый целочисленный тип, предусмотренный в конкретной реализации C ++.
Например:
enum MyEnum
{
Undefined = 0xffffffffffffffffULL
};