C++模板问题
有什么办法可以达到指定的行为吗? 如果有一些技巧,或者这可以使用traits或enable_if
完成,请让我知道。C++模板问题
template <typename T> struct Functional {
T operator()() const {
T a(5);
// I want this statement to be tranformed into
// plain 'return;' in case T = void
return a; // <---
}
};
int main() {
Functional<int> a;
a();
Functional<void> b;
b(); // <--- Compilation error here
}
就专门为无效:
template <typename T> struct Functional {
T operator()() const {
T a(5);
return a;
}
};
template <> struct Functional<void> {
void operator()() const {
}
};
你可以使用一个专门
template <> struct Functional<void> {
void operator()() const {
}
};
这应该工作
template <> struct Functional<void> //specialized for 'void'
{
void operator()() const {
//do something
return ; //optional
}
};
编辑:
你也可以写(简单的方法)
T operator()() const {
return T(5); // static_cast<> not even required
}
有更大的问题与此代码不是第一次出现。例如,如果您要将Functional的返回值转发给另一个函数,那么您不能仅将void函数指定为void,因为如果您有一个函数使用void,则可以没有把它表达出来。当然,你不能用void等变量来创建变量。总而言之,认为虚构是非法的,而不是试图对付它。
还有其他答案已经有明确的专业化答案。
只要说下面的话。它的工作原理非常清楚与T
是void
,相当于你已经证明
T operator()() const {
return static_cast<T>(5);
}
+1:我不认为大多数人知道你可以从返回类型为void的函数中'返回'void'类型的表达式。 – 2010-07-15 00:18:44
@Johannes:甚至需要'static_cast '? 'T运算符()()const {return T(t)}'可以用来代替。 – 2010-09-21 04:02:39
@Prasoon Saurav:如果声明“T t(e);”是格式良好的,对于某些发明的临时变量t(e),表达式e可以使用static_cast的形式static_cast
可以在函数返回一个'void'表达式返回'void'所以你确定这一点的代码,你您的其他功能存在更大的问题。 'T a(5)'不起作用。你不能有一个'void'类型的变量,所以一个简单的'return a;'不会起作用。不知道你的班级模板的细节很难给出具体细节。 – 2010-07-14 10:19:04