【问题标题】:How to force template class to use specified type unless specified otherwise?除非另有说明,否则如何强制模板类使用指定的类型?
【发布时间】:2019-11-23 10:07:13
【问题描述】:

我的模板类有问题。我像这样指定了模板类的默认类型:

template < class T = float >
class apple { 
public:
    T x;
    apple(T x): x(x) {}
}

但是,当我这样创建对象时:

apple obj(2);

除非我这样做,否则类型会变成 int:

apple<float> obj(2);

如何让它保持浮动?

【问题讨论】:

  • 看来您使用的是 c++17。由于 c++17 T 可以从初始化程序推导出来,在你的情况下它是 2 - int
  • 是的,我使用的是 c++17
  • 它使用您传递的文字值的类型。 apple obj(2.0f) 用于浮动,apple obj(2.0) 用于双

标签: c++ class templates template-specialization


【解决方案1】:

添加此推导指南以强制所有参数推导解析为您的默认参数:

template <class T>
apple(T) -> apple<>;

【讨论】:

  • 使用演绎指南禁用 CTAD。这是一些深奥的魔法
  • @StoryTeller CTAD 是什么?
  • @StoryTeller 所有那些抱怨脚枪的人都忽略了这样一个事实,即你应该把它拿在后面。
  • @VladfromMoscow Class template argument deduction。
【解决方案2】:

使用默认模板参数的特化,例如

apple<> obj( 2 );

【讨论】:

    【解决方案3】:

    另一种可能的解决方案是修改构造函数:

    apple(std::enable_if_t<1, T> x): x(x) {}
    

    这样,编译器将无法从您传递给x 的参数中推断出T,而是使用T(您提供的)的默认类型。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多