如何辨别“ - >”运算符最终返回一个类型?

时间:2016-05-11 01:00:12

标签: c++ templates operator-keyword

我意识到operator->返回的内容会在函数调用中调用自己的operator->,如下所示:

someVarWithOverloadedOperator->someFunc();

调用->函数的过程将继续,直到其中一个是指针,然后从该指针调用someFunc

我的问题是:是否有办法强制模板参数让其->运算符最终返回某个类:

template<typename ThisClassOperatorMustReturn_TypeA_>
class MyClass{
  void foo() {
    ThisClassOperatorMustReturn_TypeA_ var;  
    var->someClassAFunc();  //I need this `->` operator to return type "A"
  }
};

有什么办法吗?

1 个答案:

答案 0 :(得分:2)

您可以为此创建特征:

template <typename T>
using arrow_type = decltype(std::declval<T>().operator ->());

template <typename T, typename ArrowType = arrow_type<T>>
struct arrow_last_type
{
    using type = typename arrow_last_type<ArrowType>::type;
};

template <typename T, typename P>
struct arrow_last_type<T, P*>
{
     using type = P*;  
};

然后

static_assert(std::is_same<A*, arrow_last_type<ClassToTest>::type>::value, "unexpected");

Demo