C++ C++;显式积分自定义转换

C++ C++;显式积分自定义转换,c++,type-conversion,c++14,user-defined-types,C++,Type Conversion,C++14,User Defined Types,我有一个flags类,它只是一个整数的包装器,我想根据基础整数类型的转换规则实现到任意整数类型的显式转换 i、 e 假设我让全班同学遵循以下原则(忽略不相关的成员) 我还能转换成整数类型而不是int类型吗 unsigned long long iflags = static_cast<unsigned long long>(flags); unsigned long iflags=static_cast(标志); 而不是 unsigned long long iflags = s

我有一个flags类,它只是一个整数的包装器,我想根据基础整数类型的转换规则实现到任意整数类型的显式转换

i、 e

假设我让全班同学遵循以下原则(忽略不相关的成员)

我还能转换成整数类型而不是int类型吗

unsigned long long iflags = static_cast<unsigned long long>(flags);
unsigned long iflags=static_cast(标志);
而不是

unsigned long long iflags = static_cast<unsigned int>(flags);
unsigned long iflags=static_cast(标志);
或者我需要为每个整数类型显式定义一个转换运算符才能做到这一点

注意,我使用的是C++14

我读过,但没有看到任何特定于整型的东西,这让我觉得我需要显式定义所有我想要避免的有效转换。如果无法转换为目标类型,则模板转换函数将失败,我也会很高兴,注意我知道内部整数的最大值,即所有标志位都打开,作为宏/常量
FLAGS\u max
,如果这有任何用途

我还能转换成整数类型而不是int类型吗

unsigned long long iflags = static_cast<unsigned long long>(flags);
第一行是错误的,因为
标志
不能隐式转换为
无符号长

定义<代码>标志<代码>,唯一的合法初始化C++代码> IF> A/<代码>的方法是:

 unsigned long long iflags = static_cast<unsigned int>(flags);
然后你可以用

unsigned long long iflags = static_cast<unsigned long long>(flags);
unsigned long iflags=static_cast(标志);
我还能转换成整数类型而不是int类型吗

unsigned long long iflags = static_cast<unsigned long long>(flags);
第一行是错误的,因为
标志
不能隐式转换为
无符号长

定义<代码>标志<代码>,唯一的合法初始化C++代码> IF> A/<代码>的方法是:

 unsigned long long iflags = static_cast<unsigned int>(flags);
然后你可以用

unsigned long long iflags = static_cast<unsigned long long>(flags);
unsigned long iflags=static_cast(标志);

这是
static\u cast
尝试所属的,大致上说,如果你能做
T T(e),你可以做
static\u cast(e)
对于一些发明的变量
t
(在措辞中有一些有趣的舞蹈,以处理保证省略和C风格的演员奇怪之处,出于我们的目的,我们可以忽略这些)

该初始化由控制,表示您对
标志
的转换函数执行重载解析,并带有指向的指针,该指针用于说明候选项:

未隐藏在中的非显式转换函数 [
标志
]和屈服类型[
无符号长型
]或可以 通过标准转换转换为类型[
unsigned long
] 序列是候选函数。对于直接初始化,这些 在[
标志
]中未隐藏的显式转换函数,以及 屈服类型[
无符号长型[/code>]或可转换为的类型
还可以键入带有限定转换的[
unsigned long
] 候选函数


您的
显式运算符unsigned int()
既不生成
unsigned long
也不生成可以通过限定转换转换为它的类型(这与此处无关-该转换仅适用于指针-y的对象);因此,它不是候选人。由于候选集为空,重载解析失败,因此初始化格式不正确,
static\u cast

static\u cast
尝试所属的
static\u cast(e)
,粗略地说,如果可以
T(e),您可以执行
static\u cast(e)
对于一些发明的变量
t
(在措辞中有一些有趣的舞蹈,以处理保证省略和C风格的演员奇怪之处,出于我们的目的,我们可以忽略这些)

该初始化由控制,表示您对
标志
的转换函数执行重载解析,并带有指向的指针,该指针用于说明候选项:

未隐藏在中的非显式转换函数 [
标志
]和屈服类型[
无符号长型
]或可以 通过标准转换转换为类型[
unsigned long
] 序列是候选函数。对于直接初始化,这些 在[
标志
]中未隐藏的显式转换函数,以及 屈服类型[
无符号长型[/code>]或可转换为的类型
还可以键入带有限定转换的[
unsigned long
] 候选函数


您的
显式运算符unsigned int()
既不生成
unsigned long
也不生成可以通过限定转换转换为它的类型(这与此处无关-该转换仅适用于指针-y的对象);因此,它不是候选人。由于候选集为空,重载解析失败,因此初始化格式不正确,
static\u cast

,而编译器可能包含错误和非标准扩展,如果您先尝试,可能会得到一个提示。
显式
转换运算符需要显式调用或通过一些有意的强制转换来调用。执行
static_cast(标志)
将请求一个转换运算符
运算符unsigned long long()
,这不是您所拥有的,因此该程序的格式不正确。从当前的答案来看,第一点是我所期望的,但没有人提到他们是否可以简单地说,使用模板定义所有有效的整数转换,给我的旗帜类的大小。我也知道这对隐式转换有效,但是我不希望我的类隐式转换为整数类型,因为这样可以避免意外转换。但是,我也不想在执行显式转换时考虑底层类型是什么,只要目标类型可以保持