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和更高版本)。