【问题标题】:rvalue References and Template parameters右值引用和模板参数
【发布时间】:2016-06-04 15:29:54
【问题描述】:

为什么不允许使用这种语法:

template<float&& value>
struct MyStruct{
  float GetValue() { return value; }
};

MyStruct<12.1f> myFloat;

而我们必须这样做:

template<const float& value>
struct MyStruct{
  float GetValue() { return value; }
};

extern constexpr float param = 12.1f;
MyStruct<param> myFloat;

我看不出有什么理由应该禁止第一个。
第一种语法不那么笨重,而第二种语法只是让 c++ 的创建者看起来只是想让事情变得困难......那么为什么会这样呢?

【问题讨论】:

  • 因为没有人为此功能写过提案?
  • 那个怪物需要被破坏。并且相得益彰。我怀疑通过委员会获得template&lt;float&gt; class X; 会比那些东西更容易。

标签: c++ templates rvalue-reference non-type


【解决方案1】:

由于模板处理非常复杂,我认为设计师正确地拒绝了可以使用其他方式轻松完成的功能。模板参数的存在是为了自定义代码的行为,而不仅仅是插入常量。这就是支持 int 模板参数的原因,因此您可以执行以下操作:

template <int SIZE> struct X {
    char buffer[SIZE];
};

如果你只想在你的类实例中添加一个常量,将它添加到构造函数中:

class X {
public:
    X(float value_) {
        value = value_;
    }
    float value;
};

如果您真的想要一个使用该常量的自定义类,如何:

class X71 : public X {
public:
    X71() : X(7.1f) {}
};

【讨论】:

  • 是的,但是除了 ints 之外的类型,模板元编程会容易得多
  • 我认为向前发展的想法是鼓励使用 constexpr 完成诸如浮点编译时间之类的事情。 TMP 通常用于通用代码,在编译时选择路径,你不会真正使用双精度的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多