我有以下类(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区分Tstd::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/

10-13 04:57