Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不采用非类型部分专门化元组?_C++_Tuples_C++17_Typetraits - Fatal编程技术网

C++ 为什么不采用非类型部分专门化元组?

C++ 为什么不采用非类型部分专门化元组?,c++,tuples,c++17,typetraits,C++,Tuples,C++17,Typetraits,我正在尝试实现以下目标(使用C++17功能): #包括 模板 使用常数t=std::积分常数; 模板类元组{}; 模板 类元组{}; 内部主(空) { 元组类型; 元组值; } 这在g++-7.1.0中给出了以下错误 main.cpp:在函数“int main()”中: main.cpp:15:18:错误:“模板类元组”的模板参数列表中参数1的类型/值不匹配 元组值; ^ main.cpp:15:18:注意:应为一个类型,得到“1” main.cpp:15:18:错误:“模板类元组”的模板参数

我正在尝试实现以下目标(使用C++17功能):

#包括
模板
使用常数t=std::积分常数;
模板类元组{};
模板
类元组{};
内部主(空)
{
元组类型;
元组值;
}
这在g++-7.1.0中给出了以下错误

main.cpp:在函数“int main()”中:
main.cpp:15:18:错误:“模板类元组”的模板参数列表中参数1的类型/值不匹配
元组值;
^
main.cpp:15:18:注意:应为一个类型,得到“1”
main.cpp:15:18:错误:“模板类元组”的模板参数列表中参数1的类型/值不匹配
main.cpp:15:18:注意:应为a类型,得到“2”
main.cpp:15:18:错误:“模板类元组”的模板参数列表中参数1的类型/值不匹配
main.cpp:15:18:注意:需要一个类型,得到'3'

有人能解释为什么元组的部分专门化没有激活吗?

1、2和3不是类型。您的专门化不会(也不能)将主模板更改为接受值,因此您无法神奇地将值传递到以前预期的类型

如果您想要一个接受值的模板,别名模板可以这样做,而不是专门化:

template<auto... values_>
using VTuple = Tuple<constant_t<values_>... >;
模板
使用VTuple=Tuple;

但它是一个单独的模板。

1、2和3不是类型。您的专门化不会(也不能)将主模板更改为接受值,因此您无法神奇地将值传递到以前预期的类型

如果您想要一个接受值的模板,别名模板可以这样做,而不是专门化:

template<auto... values_>
using VTuple = Tuple<constant_t<values_>... >;
模板
使用VTuple=Tuple;

但它是一个单独的模板。

这是我一直试图避免的(别名),但谢谢,您是否解释了为什么不能将主模板更改为接受值?@FletcherBlight-根据专门化的本质。值不是类型的更特殊形式。它只是有一个类型。它有一个类型这一事实不允许用它来代替一个类型。这就是我一直试图避免的(别名),但谢谢你,你有没有解释为什么不能将主模板更改为接受值?@FletcherBlight-根据专门化的本质。值不是类型的更特殊形式。它只是有一个类型。它有一个类型这一事实不允许用它代替一个类型。