模板模板时强制特定的重载

Vin*_*ent 8 c++ templates metaprogramming c++11

请考虑以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,它将产生:

Version A
Version A
Run Code Online (Sandbox Code Playgroud)

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

Pub*_*bby 11

std::vector不需要单个typename参数,需要2个!不要忘记分配器.

因此,使用可变参数模板:

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

现在它可以按你的需要工作.