【问题标题】:Constructor with non-type template arguments具有非类型模板参数的构造函数
【发布时间】:2017-04-04 15:37:23
【问题描述】:

this question 中,声明不能直接为类构造函数使用模板参数,因为如果你写类似

struct S{
    template<typename T>
    S() { ... }
}

那么你就没有办法调用这个构造函数了。但是,有一些变通方法可以使这项工作发挥作用,例如,通过模板参数推导。

但我知道的所有这些变通方法都只适用于类型参数。那么问题来了

是否有任何变通方法可以使该方法适用于非类型模板参数?

struct S{
    template<int x>
    S() { ... }
}

我对适用于现代 C++(C++17 标准,包括所有 TS)的解决方案感兴趣,因为这是一个理论问题,而不是实际问题。

【问题讨论】:

  • 在给定适当的参数列表的情况下,非类型模板参数总是可以推导出来的。在给定数组时,std::size_t 参数经常发生这种情况。 Yakk 的tag 答案同样适用。
  • 你可以有template&lt;int x&gt; S(std::integral_constant&lt;int, x&gt;);
  • 不确定我理解你的意思。您能否以答案的形式写得更详细一点?
  • 虽然接受的答案为您的问题提供了技术上正确的解决方案,但我看不出使用 S s(val&lt;5&gt;{}); 比使用 S s&lt;5&gt;{}; 更好。

标签: c++ templates language-lawyer c++17


【解决方案1】:

但我知道的所有这些变通方法都只适用于类型参数

没有一种解决方法是特定于类型的——关键是在构造函数中添加一些可以推断的东西。所以如果我们想要一个类型,我们可以这样做:

template <class T> struct tag { };

struct S {
    template <class T>
    S(tag<T>);
};

如果我们想要int,我们也会这样做:

template <int I> struct val { };

struct S {
    template <int I>
    S(val<I>);
};

对于值,您甚至不需要想出自己的标签类型 - 您可以在 std::integral_constant 之上进行小猪包装。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 2013-08-26
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多