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