У меня есть класс флагов, который является только оболочкой вокруг целого числа, и я хочу реализовать явное преобразование в произвольные целые типы на основе правил преобразования для базового целочисленного типа.C++ явное интегральное пользовательское преобразование
т.е.
говорят, у меня есть класс по линиям (без учета нерелевантных членов)
class Flags {
unsigned int v;
explicit operator unsigned int() { return v; }
}
мог я все еще преобразовывают к интегральному типу, кроме междунар сказать по
unsigned long long iflags = static_cast<unsigned long long>(flags);
, а не
unsigned long long iflags = static_cast<unsigned int>(flags);
или мне нужно явно определить оператор преобразования для каждого интегрального типа, чтобы это можно было сделать?
Примечание Я использую C++ 14
Я прочитал http://en.cppreference.com/w/cpp/language/cast_operator, но не могу увидеть любую вещь, специфичной для целочисленных типов, заставляет меня думать, мне нужно четко определить все действующие преобразования, которые я хочу, чтобы избежать , Я также был бы счастлив с помощью функции преобразования шаблона, которая не будет выполнена, если преобразование в целевой тип невозможно, отметив, что я знаю максимальное значение внутреннего целого числа, то есть все флаги, включенные в качестве макроса/константы FLAGS_MAX
, если это имеет любое применение.
Хотя компиляторы могут содержать ошибки и нестандартные расширения, вы можете получить подсказку, если вы просто * попробовали это * в первую очередь. –
«Явные» операторы преобразования * должны быть вызваны явно или путем преднамеренного литья. Выполнение 'static_cast (flags);' будет запрашивать оператор преобразования 'unsigned long long()', который не является тем, что у вас есть, поэтому программа плохо сформирована. –
WhiZTiM
Из текущих ответов первая точка первая, как я и ожидал, но никто не упомянул о погоде, это простой способ сказать, используя шаблон, чтобы определить все интегральные преобразования, которые являются допустимыми, укажите размер моего класса flags. Я также понимаю, что это будет работать для неявных преобразований, однако я не хочу, чтобы мой класс был неявно конвертируемым в интегральные типы, поскольку это позволяет избежать случайных преобразований. Однако я также не хочу думать о том, что такое базовый тип, когда я делаю явное преобразование, пока мой целевой тип может содержать все бит флага. – glenflet