Есть некоторые различия между clang
и gcc
. Один из них - это то, как они трактуют указатели на метод. Учитывая следующий код:Объявление указателя на метод с decltype в C++
template <typename T_Class, typename T_Ret, typename ... Args>
void store_method(T_Class *object, T_Ret (T_Class::*method)(Args ... args));
class SomeObjectWithPotentiallyLongName {
int commonly_used_method(int var);
void register_method() {
/* The code below is okay for gcc with -std=gnu++11. But clang
* says:
* 'reference to non-static member function must be called' */
store_method(this, commonly_used_method);
/* To make this fine for clang (and also - gcc), I have to
* extend previous line as next */
store_method(this, &SomeObjectWithPotentiallyLongName::commonly_used_method);
}
}
Код выше показывает необходимость расширения кода во многих местах, чтобы сделать его составитель звоном, в то время как это может быть очень аккуратным и ясно с НКУ.
Самый очевидный способ - написать макрос, который превратил бы и method_name
в нечто вроде &TypeOfThis::method_name
.
Моя идея состояла в том, чтобы использовать decltype
:
#define STORE_METHOD(method) store_method(this, (decltype(*this))::method)
void SomeObjectWithPotentiallyLongName::register_method() {
STORE_METHOD(commonly_used_method);
}
Но этот выход кода следующее сообщение об ошибке с clang
:
'decltype (* это)' (он же 'SomeObjectWithPotentiallyLongName &') не класс, пространство имен или перечисление
Есть ли способ построить такой макрос? Если нет, есть ли другой способ решить эту проблему?
'' Т & является типом. Это может быть не тот тип, который вы хотите, но это тип. –
Да, это работает. Спасибо! – shved