c++ - 停止 C++98 和 C++11 的隐式转换

标签 c++ c++11 boost typetraits c++98

我有一个带有 get() 的模板类返回模板化类型的方法。它的内容远不止于此,但为简单起见,代码看起来像这样:

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

但是,以下也会编译:

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

我希望编译器能够捕捉到它,并告诉我我进行了非法转换。一个简单的方法是创建一个新的 Holder<T>类,它有一个转换运算符到它被模板化的类型。 get 方法的工作方式如下:

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

Holder 类看起来像这样:

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 时,棘手的一点出现了,我可能想使用 auto,当我这样做时突然:

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

value现在将是 Holder<float> 类型我不想要。任何人都可以想出一种让两者都起作用的方法,或许可以使用一些 boost 魔法。

最佳答案

您可以在 Attribute 类中定义一个 typedef:

typedef T value_type;

然后在作业部分:

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

这样你就不需要那个支架了。

如果你坚持使用那个 holder,你可以做同样的事情并从 holder 中提取 value_type

关于c++ - 停止 C++98 和 C++11 的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42416190/

相关文章:

c++ - 找出分数 a/b 的小数点后第 k 位,其中 a,b,k 是非常大的整数(小于 10e18)

c++ - 第一个参数没有从 'const value_type' 到 'const void *' 的已知转换

c++ - 具有 Boost 格式的 int 特征向量的格式化 cout

c++ - boost 异质单位 - Bar per Minute

opencv - Point3f 而不是 Point2f 用于 OpenCV 中的 KeyPoint

c++ - 终止正在运行的 boost 线程

c++ - 某种类型别名 : An empty derived class

c++ - 在基类指针上删除 [] 后出现段错误

c++ - 尝试发送第二个有效载荷后“解码有效载荷时出错”

c++ - 类不存在默认构造函数的错误