当模板<类型名、值...时强制特定重载>

Force a specific overload when template<typename, value...>

本文关键字:gt 重载 lt 类型      更新时间:2023-10-16

这个问题如下:当模板时强制一个特定的重载

考虑以下代码:

#include <iostream>
#include <vector>
#include <array>
#include <type_traits>
// Version A
template<typename T>
void f(const T& x)
{
std::cout<<"Version A"<<std::endl;
}
// Version B
template<typename... T1, template<typename...> class T>
void f(const T<T1...>& x)
{
std::cout<<"Version B"<<std::endl;
}
// Version C
template<typename T1, typename TN, template<typename, TN...> class T, TN... N>
void f(const T<T1, N...>& x)
{
std::cout<<"Version C"<<std::endl;
}
// Main
int main(int argc, char* argv[])
{
f(double());
f(std::vector<double>());
f(std::array<double, 3>()); // <- How to force the use of Version C ?
return 0;
}

默认情况下,它将生成(与GCC 4.7.1一起):

Version A
Version B
Version A

当传递的类型是一个形状良好的模板时,如何强制使用Version C(我可以添加新版本的f,我可以添加std::enable_if或其他C++11类型特征语法,但如果可能的话,我希望避免添加助手类)?

注意:该技巧应该适用于每一个积分类型TN.…

在模板参数推导中不能推导非类型模板参数的类型。这在标准中有明确规定:

14.8.2.5从类型〔temp.execure.type〕中推导模板参数

13-不能从非类型模板参数的类型推导出模板类型参数
14-[示例:

template<class T, T i> void f(double a[10][i]);
int v[10][20];
f(v); // error: argument for template-parameter T cannot be deduced

--结束示例]

这是有效的:

// Version C
template<typename T1, template<typename, size_t...> class T, size_t... N>
void f(const T<T1, N...>&) {
std::cout<<"Version C"<<std::endl;
}