質問
type
または のいずれかtype name
を入力として取り、出力として与える C++ マクロを作成しようとしてtype
います。
例:
REMOVE_NAME(int)
_int
REMOVE_NAME(int aNumber)
int
私はそのようなマクロ (以下) を書くことができましたが、それは機能しますが、これを達成するためのより簡単な方法がないかどうか疑問に思っています。
#include <boost/type_traits.hpp>
template <typename T>
struct RemoveNameVoidHelper
{
typedef typename T::arg1_type type;
};
template <>
struct RemoveNameVoidHelper<boost::function_traits<void()>>
{
typedef void type;
};
#define REMOVE_NAME(expr) RemoveNameVoidHelper<boost::function_traits<void(expr)>>::type
何か案は?
動機
このマクロを使用して、コード生成を支援しています。クラス定義で特定のメソッドを宣言するために使用される別のマクロがあります。
#define SLOT(name, type) \
void Slot##name(REMOVE_NAME(type) argument) \
{ \
/* Something that uses the argument. */ \
} \
void name(type)
通常のメソッドと同様に、マクロのユーザーがSLOT
自分のスロットをクラスの内部または外部に実装するかどうかを快適に選択できるようにしたいと考えています。これは、SLOT
の型引数が、型または名前付きの型のいずれかである可能性があることを意味します。例えば:
class SomeClass
{
SLOT(ImplementedElsewhere, int);
SLOT(ImplementedHere, int aNumber)
{
/* Something that uses aNumber. */
}
};
REMOVE_NAME
マクロがないと、自動生成されたSlot...
メソッドは引数に独自の名前を指定できず、参照できません。
もちろん、これがこのマクロの唯一の可能な用途ではありません。