2013-04-05 2 views
0

Есть ли способ для удобства вызова оператора шаблона->? Было бы здорово иметь такую ​​возможность в таких классах, как вариантоператор шаблона ->

Например: (вот только пример)

struct base_t 
{ 
    template<class T> 
    T* operator->() 
    { 
     return reinterpret_cast<T*>(this); 
    } 
}; 

int main(int argc, char* argv[]) 
{ 
    base_t x; 
    x.operator-><std::pair<int,int>>()->first; //works, but inconvenient 
    x<std::pair<int,int>>->first; // does not work 
    x-><std::pair<int,int>>first; //does not work 

    return 0; 
} 

мне нужно доказательство =)

+1

№ ⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠ – Fanael

+0

«Было бы здорово иметь такую ​​возможность в классах, как вариант« Нет, это не так. Если вы так думаете, рассмотрите тот факт, что в варианте существует объект, тип которого известен только * во время выполнения *. –

+0

@ R.MartinhoFernandes yep, но вы должны использовать его с предостережениями. Есть и другие места, где их можно использовать =) Это похоже на 'boost :: get', исключение для исключения. 'Operator ->' также может генерировать исключение. – kassak

ответ

1

Нет, это не реально, как это это не реально слишком

struct base_t 
{ 
    template<class T> 
    T operator()() 
    { 
     return T(); 
    } 
}; 

int main() 
{ 
    base_t x; 
    x.operator()<int>(); // works 
    x.()<int>(); // not works 
} 

выражение х-> т интерпретируется как (x.operator- >()) -> м для объекта класса х типа Т, если Т :: оператор ->() существует, и если оператор выбран как лучшая функция соответствия с помощью разрешения перегрузки механизма

postfix- выражение -> templateopt Ид выражение

постфикса-выражение -> псевдо-деструктор имя

Таким образом, синтаксис x-><T> просто некорректно.

+0

Я понимаю, что я могу сделать это многими другими способами. Но разве это стандартно? – kassak

+0

Или это ограничение по грамматике, предусмотренное в стандарте? – kassak

+0

Хорошо, спасибо, что я хотел – kassak

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