一个模板专门化用于pod,一个模板专门化用于类层次结构,在其他情况下出现错误



我试图创建一个模板,它将以一种方式为所有基本类型工作,其他方式为所有类从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<>的第二个参数是返回类型

最新更新