C++ 停止C+的隐式转换+;98和C++;11
我有一个带有C++ 停止C+的隐式转换+;98和C++;11,c++,c++11,boost,typetraits,c++98,C++,C++11,Boost,Typetraits,C++98,我有一个带有get()方法的模板化类,该方法返回模板化的类型。它有更多的功能,但为简单起见,代码如下所示: Attribute<float> attr(0.0f); float value = attr.get(); template<typename T> class Holder { private: T m_value; public: Holder(T value) : m_value(value) {}
get()
方法的模板化类,该方法返回模板化的类型。它有更多的功能,但为简单起见,代码如下所示:
Attribute<float> attr(0.0f);
float value = attr.get();
template<typename T>
class Holder
{
private:
T m_value;
public:
Holder(T value) : m_value(value) {}
//implicit conversion
operator T() const { return m_value; }
};
属性属性属性属性(0.0f);
float value=attr.get();
但是,以下内容也将汇编:
Attribute<float> attr(0.0f);
int value = attr.get();
属性属性属性属性(0.0f);
int value=attr.get();
我希望编译器捕捉到这一点,并告诉我,我有一个非法的转换。一种简单的方法是创建一个新的Holder
类,该类有一个转换运算符,转换为模板化的类型。get方法的工作原理如下:
template<typename T>
Holder<T> Attribute::get()
{
return Holder<T>(m_value);
}
模板
Holder属性::get()
{
报税表持有人(m_值);
}
Holder类看起来像:
Attribute<float> attr(0.0f);
float value = attr.get();
template<typename T>
class Holder
{
private:
T m_value;
public:
Holder(T value) : m_value(value) {}
//implicit conversion
operator T() const { return m_value; }
};
模板
阶级持有者
{
私人:
T m_值;
公众:
持有者(T值):m_值(值){}
//隐式转换
运算符T()常量{返回m_值;}
};
(我刚刚在编辑器中编写了这篇文章,还没有对它进行测试,但这应该可以在C++98中实现我想要的功能)
属性属性属性属性(0.0f);
//现在不应该编译它,因为我们没有从
//持有人到整数。
int value=attr.get();
当我们转到C++11时,有一点很棘手,我可能想使用auto,突然,当我这样做时:
Attribute<float> attr(0.0f);
auto value = attr.get();
属性属性属性属性(0.0f);
自动值=attr.get();
value
现在将是我不想要的类型Holder
。任何人都能想出一种方法让这两种方法都起作用,也许是通过一些增强魔法。您可以在属性类中定义typedef
,如下所示:
typedef T value_type;
然后在作业部分:
Attribute<float> attr(0.0f);
decltype(attr)::value_type value = attr.get();
属性属性属性属性(0.0f);
decltype(attr)::value_type value=attr.get();
这样你就不需要那个支架了
如果你坚持使用这个支架,你也可以这样做,从支架中提取value\u type
。“隐式铸造”似乎是一个矛盾修饰法。是否真的是value
属于holder
类型的问题?如果需要,它不会自动转换为float
吗?您可能需要gcc/clangflag-Wconversion
。此外,您最好测试返回Holder
实际上会阻止转换为int
。我无法为以下行生成编译错误:int value=attr.get()代码>@Jarod42是的。。。这可能是最简单的方法,我只需要检查一下我没有在其他地方使用隐式转换。我只是想知道是否有人能想到一种“在代码中”的方式来实现它。@Jarod42是真的,但我的解决方案消除了所有隐式转换没有使用auto
的转换。您可以使用类型类型进行隐式转换,例如属性attr(0.0f),属性attr2(42);decltype(attr2)::value_type=attr.get()代码>。它不是更安全,只是更详细,对于C++03也不能解决任何问题(因为auto
和decltype
仅适用于C++11和更高版本)。