这可能很简单,我只是无法找到答案。我有一个实现各种运算符的模板类。其中一个是解除引用运算符(operator*
)。不幸的是,我似乎无法弄清楚如何正确指定返回类型。这就是我正在做的事情。
template <typename Type>
class Noodles
{
private:
Type _value;
public:
Type operator+( const Type& rhs ) const { return Type + rhs; }
Type operator-( const Type& rhs ) const { return Type - rhs; }
// Many more operators that simply pass the call
// down to the actual value type. You get the idea.
// This is where I'm having the problem
[what goes here] operator*( ) const { return *_value; }
};
如您所见,此类只是尝试包装任何给定类型并在该给定类型上执行运算符函数。我已经尝试了以下,但无济于事:
// Illegal use of Type as an expression
auto operator*( ) -> decltype( *Type ) const { return *_value; }
// Undeclared identifier / not a static field
auto operator*( ) -> decltype( *_value) const { return *_value; }
// Undeclared identifier / not a static field
auto operator*( ) -> decltype( *Noodles<Type>::_value ) const { return *_value; }
// 'this' can only be referenced in non-static member functions
auto operator*( ) -> decltype( *this->_value ) const { return *_value; }
所以我不知道该怎么做。大多数示例显示了一个采用模板参数的方法,声明看起来像auto Add( A lhs, B rhs ) -> decltype( lhs + rhs )...
,但这对我没有任何帮助。
注意:我目前正在使用VS2010,因此我使用的是decltype v1.0。
感谢您的帮助!
答案 0 :(得分:2)
你需要std::declval
,但不幸的是,VS2010还没有实现。所以你必须解决一下:
template <typename Type>
class Noodles
{
private:
Type _value;
static Type myTypeDeclval();
public:
auto operator*( ) -> decltype( *myTypeDeclval() ) const { return *_value; }
};