返回类型不可知模板类成员函数

时间:2019-07-28 19:59:44

标签: c++ c++11 sfinae

我有一个类似的课程:

tempate<class TReturn>
struct MyClass {
 template<class T>
 TReturn doSomething(const T &t) {
  // Do something
  return someValue;
 }
};

现在TReturn甚至可以是空的任何东西,但是如果它是空的,我希望结尾处没有return语句,并且该函数中有一些较小的不同代码。我想要的是一个不同的函数体,具体取决于返回类型。我正在使用C ++ 11,所以如果constexpr对我来说不可能。在纯C ++ 11中有什么办法做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以为void提供您课程的专业化内容:

tempate<>
struct MyClass<void> {
 template<class T>
 void doSomething(const T &t) {
  // Do something else
 }
};

如果该类实际上比您所显示的要大,并且您只想专用于这个函数而不是整个函数,那么a)如果仅将a作为一个类的参数,则TReturn可能是不明智的该类的一小部分依赖于它,但是b)有模拟它的方法。例如。您可以通过间接地通过帮助器类来对方法进行“部分专业化”(与函数模板不同,类模板允许部分专业化)。像这样:

tempate<class TReturn> struct MyClass;

namespace internal {
  template <typename TReturn, typename T>
  class MyClassDoSomethingHelper {
    static TReturn Run(MyClass<TReturn>* that, const T &t) {
      // do something
      return someValue;
    }
  };

  template <typename T>
  class MyClassDoSomethingHelper<void, T> {
    static void Run(MyClass<void>* that, const T &t) {
      // do something else
    }
  };
}  // namespace internal

tempate<class TReturn>
struct MyClass {
 template<class T>
 TReturn doSomething(const T &t) {
   return internal::MyClassDoSomethingHelper<TReturn, T>::Run(this, t);
 }
};