c++ - 一种用于 POD 的模板特化,一种用于类层次结构和其他情况下的错误?

标签 c++ templates c++11

我正在尝试创建一个模板,该模板将以一种方式适用于所有基本类型,另一种方式适用于从 A 派生的所有类,而对其他所有类均无效。阅读 SFINAE,我创建了这样的东西:

struct A {};
struct B : A
{
    int a;
};
template <typename T, typename = typename std::enable_if<std::is_base_of<A, T>::value>::type>
void foo(const T& derived)
{
    std::cout << "stuff with derived";
}

template <typename T, typename = typename std::enable_if<std::is_fundamental<T>::value>::type>
void foo(const T& pod)
{
    std::cout << "stuff with fundamental";
}

int main()
{
    foo(7);
    B instance;
    foo(instance);
}

据我了解,7 (int) 的匹配模板类型在第一种情况下失败,在第二种情况下有效,派生类在第一种情况下有效。我做错了什么?

最佳答案

试试这个:

#include <iostream>

struct A {};
struct B : A
{
    int a;
};
template <typename T>
typename std::enable_if<std::is_base_of<A, T>::value, void>::type foo(const T& derived)
{
    std::cout << "stuff with derived";
}

template <typename T>
typename std::enable_if<std::is_fundamental<T>::value, void>::type foo(const T& pod)
{
    std::cout << "stuff with fundamental";
}

int main()
{
    foo(7);
    B instance;
    foo(instance);
}

enable_if<>的第二个参数是返回类型。

关于c++ - 一种用于 POD 的模板特化,一种用于类层次结构和其他情况下的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38104811/

相关文章:

c++11 - 为什么我需要两次将迭代器解引用到智能指针而不是使用 operator->()?

C++代码循环问题

c++ - 带有额外 ":"或 "-"c++ 的文件名

c++ - 是否可以定义 "template function pointer"的类型?

wpf - TreeViewItem - 一起使用 ControlTemplate 和 HierarchicalDataTemplate

asp.net-mvc - 让 SubSonic MVC 模板与我的数据库一起使用

c++ - 迭代超过 10GB+ 的二进制文件

c++ - 如何在 Visual Studio 操作中输出新行?

c++ - 构造函数带参数时如何实例化模板类

c++ - C++11 中具有 C 链接的复杂类型