对C 98和C 11的停止隐式转换

Stop implicit conversion for C++98 and C++11

本文关键字:转换      更新时间:2023-10-16

我有一个带有get()方法的模板类,该类方法返回了它的模板。还有更多的东西,但是为简单起见,代码看起来像:

Attribute<float> attr(0.0f);
float value = attr.get();

但是,以下内容也将编译:

Attribute<float> attr(0.0f);
int value = attr.get();

我希望编译器抓住这一点,并告诉我我有非法conversion依。一种简单的方法是创建一个新的Holder<T>类,该类带有转换操作员到其模板上的类型。GET方法的工作方式如下:

template<typename T>
Holder<T> Attribute::get()
{
    return Holder<T>(m_value);
}

带有持有人的班级看起来像:

template<typename T>
class Holder 
{
    private:
        T m_value;
    public:
        Holder(T value) : m_value(value) {}
        //implicit conversion
        operator T() const { return m_value; }
};

(我只是在编辑器中写了这篇文章,但还没有测试过,但是要在C 98中做我想做的事情)

Attribute<float> attr(0.0f);
// This should now not compile because we have no conversion from
// Holder<float> to int.
int value = attr.get();

当我们移动C 11时,棘手的位是我想使用自动的,突然间,当我这样做时:

Attribute<float> attr(0.0f);
auto value = attr.get();

value现在将是我不想要的类型Holder<float>。任何人都可以想到一种允许两者工作的方法,也许会带着一些增强的魔法。

您可以在Attribute类中定义typedef,如:

typedef T value_type;

,然后在分配部分:

Attribute<float> attr(0.0f);
decltype(attr)::value_type value = attr.get();

这样您就不需要那个持有人。

,如果您坚持使用该持有人,则可以做相同的操作并从持有人中提取value_type