C++ 如何在构造函数上指定不可推断的模板参数?

C++ 如何在构造函数上指定不可推断的模板参数?,c++,templates,C++,Templates,可以提供无法推导的模板化构造函数模板参数: struct X { int i; template<int N> X() : i(N) { } }; struct X { int i; 模板 X():i(N) { } }; 您将如何使用这样的构造函数?你能用它吗?不,你能用。有几种选择 如@KerrekSB的注释所示,您可以为构造函数模板提供一个std::integral_常量参数,当作为参数传递时,将推断N: 代码: 你不能。由于构造函数

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

struct X
{
    int i;

    template<int N>
    X() : i(N)
    {
    }
};
struct X
{
int i;
模板
X():i(N)
{
}
};
您将如何使用这样的构造函数?你能用它吗?

不,你能用。有几种选择

  • 如@KerrekSB的注释所示,您可以为构造函数模板提供一个
    std::integral_常量
    参数,当作为参数传递时,将推断
    N
  • 代码:


    你不能。由于构造函数没有名称,所以不能指定构造函数模板的模板参数。所有模板参数都必须是可推断的。当然,您可以通过其他方式实现编译时常量表达式初始化,例如使用
    std::integral_constant
    参数等进行标记分派。您的用例是什么?@DieterLücking,我会将其与类型一起用于包装对象的分配。我使用了一个函数,类似于
    make_unique
    #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);
    }
    
    template<int N>
    X make_X()
    {
        return X(std::integral_constant<int, N>{});        
    }
    
    int main()
    {
        auto y = make_X<42>();
        assert(y.i == 42);
    }