请考虑以下代码:
#include <iostream>
#include <vector>
#include <type_traits>
// Version A
template<typename T>
void f(const T& x)
{
std::cout<<"Version A"<<std::endl;
}
// Version B
template<template<typename> class T, typename T1>
void f(const T<T1>& x)
{
std::cout<<"Version B"<<std::endl;
}
// Main
int main(int argc, char* argv[])
{
f(double());
f(std::vector<double>()); // <- How to force the use of version B ?
return 0;
}
默认情况下,它会产生:
Version A
Version A
当传递的类型是具有良好形状的模板模板时,如何强制使用Version B
(我可以添加f
的新版本,我可以添加std::enable_if
或其他C ++ 11类型特征语法,但如果可能的话我想避免添加辅助类)?
答案 0 :(得分:11)
std::vector
不会带一个typename
参数,需要2个!不要忘记分配器。
因此,使用可变参数模板:
template<template<typename...> class T, typename T1>
void f(const T<T1>& x)
{
std::cout<<"Version B"<<std::endl;
}
现在它可以按你的需要工作。
答案 1 :(得分:1)
正如Pubby在his answer中解释的那样,std :: vector是一个带有两个参数的模板,因此你的重载函数需要占用更多的模板参数。如果您不想使用可变参数模板,则需要设置正确数量的参数:
#include <iostream>
#include <vector>
#include <type_traits>
// Version A
template<typename T>
void f(const T& )
{
std::cout<<"Version A"<<std::endl;
}
// Version B
template<template<typename,typename> class T, typename T1,typename T2>
void f(const T<T1,T2>& )
{
std::cout<<"Version B"<<std::endl;
}
template<typename T>
void baa(const T&)
{
}
// Main
int main()
{
f( double() );
f( std::vector<double>() ); // <- How to force the use of version B ?
}