C++17中带参数包的类模板参数推断

C++17中带参数包的类模板参数推断,c++,c++17,template-argument-deduction,C++,C++17,Template Argument Deduction,我试图在一个类上实现类模板参数推断。我的类是在一个类型T上模板化的,它将是一个数值类型,构造函数是在一个std::size\u T参数包上模板化的 包括 包括 包括 模板 结构我的数组 { 模板 我的_数组大小类型(&s): 数据std::forward std::experimental::make_数组std::forwards。。。 { } T值=T; std::数组数据; }; 模板 我的数组维度&&…->我的_数组; int main { 我的_数

我试图在一个类上实现类模板参数推断。我的类是在一个类型T上模板化的,它将是一个数值类型,构造函数是在一个std::size\u T参数包上模板化的

包括 包括 包括 模板 结构我的数组 { 模板 我的_数组大小类型(&s): 数据std::forward std::experimental::make_数组std::forwards。。。 { } T值=T; std::数组数据; }; 模板<类型名T,类别…尺寸> 我的数组维度&&…->我的_数组; int main { 我的_数组a3、4、5; a、 数值=2.32; std::coutT在这里是非推断上下文:

template <  typename T, class... Dimensions>
my_array( Dimensions&& ... )->my_array<T, sizeof...(Dimensions)>;
此外,正如之前多次被问到的那样,这不是一件事:

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>
T在这里是非推断上下文:

template <  typename T, class... Dimensions>
my_array( Dimensions&& ... )->my_array<T, sizeof...(Dimensions)>;
此外,正如之前多次被问到的那样,这不是一件事:

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>

我的理解是,如果T与std::array value\u类型相同,那么您建议的推断是合适的。在我的例子中,std::array类型是std::size\u T,而T是一个通用的数字类型。@SteveRodeen我不确定这有什么关系?不管怎样,您可以随意更改推断指南,我只是提供了一个模型。重点是T“一切都必须是可推断的。@SteveRodeen,你的第一个参数是3.0表示双精度。@Barry,当然一切都需要是可推断的。我希望我可以用新的推断规则替换make_my_数组函数,该函数可以实现适当的推断,如:auto a=make_my_array2,3,4。@SergeyA,谢谢你的回答。I b”我的理解是,如果T与std::array value\u类型相同,那么您建议的推断将是合适的。在我的例子中,std::array类型是std::size\u T,而T是一个通用的数字类型。@SteveRodeen我不确定为什么这很重要?无论如何,您可以使用c不管你想怎样修改演绎指南,我只是提供一个模型。重点是所有的东西都必须是可演绎的。@SteveRodeen,你的第一个参数是3.0表示双精度。@Barry,当然所有的东西都需要是可演绎的。我希望我可以替换一个make_my_数组函数,它可以实现正确的演绎,比如:auto a=make_我的_array2,3,4,以及新的扣减规则。@SergeyA,谢谢你的回复。我相信采用类似于你建议的东西会使界面不一致