Перечисление на 64 бита в C++?

Цепочка работает так, что каждый из этих методов возвращает объект, у которого следующий метод является свойством. Это означает, что вы можете использовать что-то вроде 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)

19
задан Rob 16 September 2008 в 20:28
поделиться

9 ответов

Я не думаю, что это возможно с 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.

17
ответ дан 30 November 2019 в 02:45
поделиться

C++ 11 поддержек это, с помощью этого синтаксиса:

enum class Enum2 : __int64 {Val1, Val2, val3};
17
ответ дан 30 November 2019 в 02:45
поделиться

Ответы, относящиеся к __int64, пропускают проблему. Перечисление допустимо во всех компиляторах C++, которые имеют истинный целочисленный тип на 64 бита, т.е. любой C++ 11 компиляторов или C++ 03 компилятора с соответствующими расширениями. Расширения C++ 03 как __int64 работа по-другому через компиляторы, включая ее пригодность как базовый тип для перечислений.

4
ответ дан 30 November 2019 в 02:45
поделиться

Так как Вы работаете в C++, другая альтернатива могла бы быть

const __int64 LARVE_VALUE = ...

, Это может быть указано в файле H.

1
ответ дан 30 November 2019 в 02:45
поделиться

Ваш snipplet кода не является стандартом C++:

перечислимый MY_ENUM: неподписанный __ int64

не имеет смысла.

константа использования __ int64 вместо этого, как Torlack предполагает

1
ответ дан 30 November 2019 в 02:45
поделиться

Если компилятор не поддерживает перечисления на 64 бита флагами компиляции или какими-либо другими средствами, я думаю, что нет никакого решения этого.

Вы могли создать что-то как в Вашем образце что-то как:

namespace MyNamespace {
const uint64 LARGE_VALUE = 0x1000000000000000;
};

и использование его точно так же, как перечисление с помощью

MyNamespace::LARGE_VALUE 

или

using MyNamespace;
....
val = LARGE_VALUE;
2
ответ дан 30 November 2019 в 02:45
поделиться

Перечисление в C++ может быть любым целочисленным типом. У Вас может, например, быть перечисление символов. IE:

enum MY_ENUM
{
   CHAR_VALUE = 'c',
};

я был бы принимать , это включает __ int64. Попробуйте всего

enum MY_ENUM
{
   LARGE_VALUE = 0x1000000000000000,
};

По словам моего комментатора, sixlettervariables, в C базовый тип будет интервалом всегда, в то время как в C++ базовый тип - то, что является достаточно большим для установки самому большому включенному значению. Таким образом, оба перечисления выше должны работать.

0
ответ дан 30 November 2019 в 02:45
поделиться

В MSVC ++ вы можете сделать это:

enum MYLONGLONGENUM: __ int64 {BIG_KEY = 0x3034303232303330, ...};

0
ответ дан 30 November 2019 в 02:45
поделиться

Текущий проект так называемого C ++ 0x , это n3092 , говорится в 7.2 Объявления перечисления , параграф 6:

Это реализация -определено, какой интегральный тип используется в качестве базового типа , за исключением того, что базовый тип не должен быть больше , чем int, если только значение {{1} }} перечислитель не может поместиться в int или unsigned int.

В том же абзаце также говорится:

Если никакой интегральный тип не может представлять все значения перечислителя, перечисление имеет неправильный формат.

Моя интерпретация части , если значение перечислителя не может поместиться в int или unsigned int , заключается в том, что вполне допустимо и безопасно инициализировать перечислитель с 64-битным целочисленным значением, пока существует 64 -битовый целочисленный тип, предусмотренный в конкретной реализации C ++.

Например:

enum MyEnum
{
    Undefined = 0xffffffffffffffffULL
};
5
ответ дан 30 November 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: