2016-05-11 6 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

Must определенный класс будет использоваться "как есть", или вы можете добавить определенный метод , или член класса, с целью реализации этого ограничения шаблона? –

+0

Вы хотите, чтобы он возвращал 'A' в цепочном вызове, в первом вызове или в конце цепочки (так что' A * ')? – Jarod42

+0

Вы пробовали статическое утверждение 'std :: is_same' между' A * 'и' declltype (var.operator ->()) '(после отбрасывания' 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

 Смежные вопросы

  • Нет связанных вопросов^_^