C++ 在调用时仅指定一些模板参数
考虑一小段可变模板代码:C++ 在调用时仅指定一些模板参数,c++,c++14,language-lawyer,icc,template-argument-deduction,C++,C++14,Language Lawyer,Icc,Template Argument Deduction,考虑一小段可变模板代码: #include <type_traits> template<int Dim, class... Idcs> std::enable_if_t<sizeof...(Idcs) == 1> doit(Idcs... idcs) {} int main() { doit<0>(1); } 可以通过更改main()内部的调用来完全指定所有模板参数来解决此问题 doit<0, int>(1); 这很可
#include <type_traits>
template<int Dim, class... Idcs>
std::enable_if_t<sizeof...(Idcs) == 1> doit(Idcs... idcs)
{}
int main()
{
doit<0>(1);
}
可以通过更改main()
内部的调用来完全指定所有模板参数来解决此问题
doit<0, int>(1);
这很可能是在第19版中修复的icc中的错误: 更多调查显示,icc v18(不编译您的代码)正确地推断出
idc
,而不使用enable\u if
:
模板
尺寸(Idcs…Idcs)
{
静态断言(sizeof…(Idcs)==1);
返回…的大小(Idcs);
}
自动测试()
{
return doit(1);//即使在icc v18上也正确返回1
}
@bolev补充道,我还将第一个模板参数类型更改为int
,因为我无意中包含了一些其他定义了size\u t
的不相关的头。
doit<0, int>(1);
g++ -std=c++14 myfile.cpp
clang++ -std=c++14 myfile.cpp
icc -std=c++14 myfile.cpp
template<size_t Dim, class... Idcs>
size_t doit(Idcs... idcs)
{
static_assert(sizeof...(Idcs) == 1);
return sizeof... (Idcs);
}
auto test()
{
return doit<0>(1); // correctly returns 1 even on icc v18
}