使用C ++ 17中的参数包进行类模板参数推导

时间:2017-08-22 17:28:04

标签: c++ c++17 template-deduction

我正在尝试在类上实现类模板参数推导。我的类通过类型T(将是数字)和std::size_t参数包上的构造函数进行模板化。

#include <iostream>
#include <utility>
#include <experimental/array>

template < typename T, std::size_t S>
struct my_array
{               
    template < typename ...SizeTypes>
    my_array( SizeTypes&& ... s ):
    data( std::forward<std::array<std::size_t, S>>( std::experimental::make_array<std::size_t>( std::forward<SizeTypes>(s)... ) ) )
    { 
    }

    T value = T();
    std::array<std::size_t, S> data;
};

template <  typename T, class...Dimensions>
my_array( Dimensions&& ... )->my_array<T, sizeof...(Dimensions)>;

int main()
{   
    my_array<double> a(3, 4, 5);
    a.value = 2.32;
    std::cout << a.value << ", " << a.data[1] << std::endl;
    return 0;
}

我收到以下错误:

prog.cc: In function 'int main()':
prog.cc:24:20: error: wrong number of template arguments (1, should be 2)
     my_array<double> a(3, 4, 5);

Demo

有关如何正确实施此方法的任何想法?

1 个答案:

答案 0 :(得分:4)

T是非推断的上下文:

template <  typename T, class... Dimensions>
my_array( Dimensions&& ... )->my_array<T, sizeof...(Dimensions)>;

由于无法推断T,因此永远不会选择此扣除指南。所有隐含指南都不可行。

相反,你应该像标准库那样做:

template <class T, class... U>
my_array(T, U...) -> my_array<T, 1 + sizeof...(U)>;

此外,正如之前多次被问到的那样,这不是一件事:

my_array<double> a(3, 4, 5);

您要么推断所有,要么推断没有。所以这应该是:

my_array<double, 3> a(3, 4, 5); // no deduction
my_array            b(3.0, 4, 5); // full deduction, b is also my_array<double, 3>