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

时间:2015-10-01 16:25:13

标签: c++ templates

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

struct X
{
    int i;

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

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

1 个答案:

答案 0 :(得分:3)

不,你can't specify constructor template arguments。有几种选择。

  1. 如@KerrekSB的评论中所示,您可以为构造函数模板提供std::integral_constant参数,当作为参数传递时,将推导出N
  2. 代码:

    #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);
    }
    

    Live Example

    1. 您可以编写隐藏make_X<N>样板的专用integral_constant模板包装器:
    2. 代码:

      template<int N>
      X make_X()
      {
          return X(std::integral_constant<int, N>{});        
      }
      
      int main()
      {
          auto y = make_X<42>();
          assert(y.i == 42);
      }
      

      Live Example