clang
とgcc
の間にはいくつかの違いがあります。それらの1つは、メソッドへのポインタをどのように扱うかです。C++でdecltypeを持つメソッドへのポインタを宣言する
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);
}
}
上記のコードは、それは非常にきれいとgccのように明確にすることができますが、それは、打ち鳴らすによってコンパイルさせるために多くの場所でコードを拡張する必要性を示しています。次のコードを考えます。
最も明白な方法は、のようなものにthis
と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 &')がありませんクラス、名前空間、または列挙型
このようなマクロを構築する方法はありますか?そうでない場合、この問題を解決する別の方法がありますか?
'T&'タイプです。あなたが望むタイプではないかもしれませんが、タイプです。 –
これはうまくいきます。ありがとうございました! – shved