c++ - 模板模板时强制特定重载

标签 c++ templates c++11 metaprogramming

考虑以下代码:

#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

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

最佳答案

std::vector 不接受单个 typename 参数,它需要 2 个!不要忘记分配器。

因此,使用可变模板:

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

现在它如你所愿。

关于c++ - 模板模板时强制特定重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13910355/

相关文章:

c++ - UDP 接收不工作

c++ - 找不到用户创建的类的构造函数

c++ - 模板类特化/显式实例化是否可以提高编译/链接器速度?

c++ - 调用多参数模板函数

c++ - g++ 在 static_assert 中接受 const 作为 constexpr

c++ - 使用可变参数模板时出现意外的隐式转换?

c++ - 构建选项已更改,正在重建所有退出状态 1 [Error] Exit with code=1 MXChip Azure IoT Dev Kit

jQuery 模板引擎

c++ - 在 .cpp 文件之外使用模板化函数而不在 .hh 文件中声明它

c++ - 具有 constexpr 函数的模板作为参数返回