我有以下类(class):
class Foo {
public:
template <typename T>
T bar() {
cout << "Called with return type: " << typeid(T).name() << endl;
T t = //... (some implementation here)
return t;
}
}
它是通过以下方式调用的:
Foo foo;
int i = foo.bar<int>();
long l = foo.bar<long>();
现在,我想对用
shared_ptr<T>
调用函数的情况进行不同的特化处理Foo foo;
foo.bar<shared_ptr<int>>();
foo.bar<shared_ptr<long>>();
但是,当然,我不想为每种类型创建完整的特化知识。是否有可能实现这种行为(如果需要,可以基于特征)?
最佳答案
由于尚无人提出,因此可以使用SFINAE区分T
和std::shared_ptr<U>
:
template <typename T>
struct is_shared_ptr_impl : std::false_type {};
template <typename T>
struct is_shared_ptr_impl<std::shared_ptr<T>> : std::true_type {};
template <typename T>
using is_shared_ptr = typename is_shared_ptr_impl<typename std::decay<T>::type>::type;
class Foo
{
public:
template <typename T>
auto bar()
-> typename std::enable_if<!is_shared_ptr<T>{}, T>::type
{
std::cout << "T is " << typeid(T).name() << std::endl;
return {};
}
template <typename T>
auto bar()
-> typename std::enable_if<is_shared_ptr<T>{}, T>::type
{
using U = typename std::decay<T>::type::element_type;
std::cout << "T is shared_ptr of " << typeid(U).name() << std::endl;
return {};
}
};
DEMO
关于返回类型的C++ 11方法模板特化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26915718/