如何在构造函数中指定不可推导的模板形参

How can I specify non-deducible template parameters on a constructor?

本文关键字:形参 构造函数      更新时间:2023-10-16

可以为模板化的构造函数提供无法推导的模板参数:

struct X
{
    int i;
    template<int N>
    X() : i(N)
    {
    }
};

如何使用这样的构造函数?你会用它吗?

不,不能指定构造函数模板参数。有几个选择。

  1. 正如@KerrekSB在注释中指出的,你可以给构造函数模板一个std::integral_constant参数,当它作为参数传递时,将推断出N:
代码:

#include <cassert>
#include <type_traits>
struct X
{
    int i;
    template<int N>
    X(std::integral_constant<int, N>) : i(N)
    {
    }
};
int main()
{
    std::integral_constant<int, 6> six;
    X x(six);
    assert(x.i == 6);
}
<<p> 生活例子/strong>
  • 您可以编写一个专用的make_X<N>模板包装器来隐藏integral_constant锅炉板:
  • 代码:

    template<int N>
    X make_X()
    {
        return X(std::integral_constant<int, N>{});        
    }
    int main()
    {
        auto y = make_X<42>();
        assert(y.i == 42);
    }
    
    <<p> 生活例子/strong>