9

質問

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...メソッドは引数に独自の名前を指定できず、参照できません。

もちろん、これがこのマクロの唯一の可能な用途ではありません。

4

1 に答える 1

2

あなたは正しいと思います。私が知る限り、decl-specifier-seqまたはtype-specifier-seq の後にオプションの宣言子が続く唯一のプロダクションはcatchステートメントであり、それは型抽出にはあまり役に立たないと思います。プロダクションパラメータ宣言template-parameter-listでも使用されますが、それもあまり役に立ちません。

マクロを次のように定義して、Boost への依存を削除します。

template<typename T> struct remove_name_helper {};
template<typename T> struct remove_name_helper<void(T)> { typedef T type; };
template<> struct remove_name_helper<void()> { typedef void type; };

#define REMOVE_NAME(expr) typename remove_name_helper<void(expr)>>::type
于 2012-09-03T14:21:41.923 に答える