强制使用特定重载参数当模板作为模板参数时

8
请看以下代码:

考虑以下代码:

#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类型特征语法,但如果可能的话,我想避免添加辅助类)?
2个回答

11

std::vector不接受单个typename参数,而是需要两个!别忘了分配器。

因此,请使用可变模板:

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

现在它可以按照您的要求正常工作。

1

正如Pubby在他的回答中所解释的那样,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 ?
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接