运算符上的尾随返回类型*在模板类中

时间:2013-12-05 14:26:16

标签: c++ visual-studio-2010 templates c++11 trailing-return-type

这可能很简单,我只是无法找到答案。我有一个实现各种运算符的模板类。其中一个是解除引用运算符(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。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

你需要std::declval,但不幸的是,VS2010还没有实现。所以你必须解决一下:

template <typename Type>
class Noodles
{
private:
    Type _value;
    static Type myTypeDeclval();
public:
    auto operator*( ) -> decltype( *myTypeDeclval() ) const { return *_value; }
};