我有一个类似的课程:
tempate<class TReturn>
struct MyClass {
template<class T>
TReturn doSomething(const T &t) {
// Do something
return someValue;
}
};
现在TReturn甚至可以是空的任何东西,但是如果它是空的,我希望结尾处没有return语句,并且该函数中有一些较小的不同代码。我想要的是一个不同的函数体,具体取决于返回类型。我正在使用C ++ 11,所以如果constexpr对我来说不可能。在纯C ++ 11中有什么办法做到这一点?
答案 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);
}
};