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 
} 
+8

可以在函数返回一个'void'表达式返回'void'所以你确定这一点的代码,你您的其他功能存在更大的问题。 'T a(5)'不起作用。你不能有一个'void'类型的变量,所以一个简单的'return a;'不会起作用。不知道你的班级模板的细节很难给出具体细节。 – 2010-07-14 10:19:04

就专门为无效:

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等变量来创建变量。总而言之,认为虚构是非法的,而不是试图对付它。

还有其他答案已经有明确的专业化答案。

只要说下面的话。它的工作原理非常清楚与Tvoid,相当于你已经证明

T operator()() const { 
    return static_cast<T>(5); 
} 
+3

+1:我不认为大多数人知道你可以从返回类型为void的函数中'返回'void'类型的表达式。 – 2010-07-15 00:18:44

+0

@Johannes:甚至需要'static_cast '? 'T运算符()()const {return T(t)}'可以用来代替。 – 2010-09-21 04:02:39

+0

@Prasoon Saurav:如果声明“T t(e);”是格式良好的,对于某些发明的临时变量t(e),表达式e可以使用static_cast的形式static_cast (e)显式转换为T类型8.5)。所以两者都是一样的。当然你不能这样做(void v(5))这就是为什么我猜标准有一个关于转换为void的明确注释(在static_cast下)。我喜欢static_cast,因为它是明确的 – Chubsdad 2010-09-21 04:15:45