2016-05-11 39 views
1

我意识到,无论是由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" 
    } 
}; 

没有办法做到这一点?

+0

必须在一定的阶级用来“原样”,也可以添加特定的方法,或为了实现这个模板限制的目的而成为该类的成员? –

+0

你希望它在连锁调用,第一次调用或链条末尾返回'A'(所以'A *')? – Jarod42

+0

您是否在'A *'和'declltype(var.operator - >())'之间尝试了'std :: is_same'的静态断言?​​(如果相关,丢弃'const'后? –

回答

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

相关问题