0

私はしばらくの間この問題にぶつかっていて、それを解決する方法を理解することができません。コンテキストは、C++のリフレクションシステムです。問題のスリムな説明はこれです。私はそれらの2つの構造体を持っています。1つは、ClassTypeタイプの複数の親を表すもので、もう1つは、Orphanクラス(ClassTypeタイプのクラスで、親がないもの)を表します。

template<typename ClassType, typename... ParentTypeList>
struct Parents 
{
};

template<typename ClassType>
struct Parents<ClassType>
{        
};

次に、反映されるクラスの宣言で、このマクロを使用します。クラスReflectionHelper::Parentsは上記のクラスです。

#define DEFINE_METACLASS(className, ...) \
private: \
typedef className SelfType; \
typedef ReflectionHelper::Parents<SelfType, __VA_ARGS__ > ParentList \

孤立したクラスの使用法は次のようになります。

class TestMetaClassDefine
{
DEFINE_METACLASS(TestMetaClassDefine);     
};

ここで問題となるのは、__ VA_ARGS__が空であり、

typedef ReflectionHelper::Parents<SelfType, __VA_ARGS__ > ParentList;

したがって、は無効です。

これを解決するために私が考えた1つの方法は、デフォルトのテンプレート引数を使用することですが、可変個引数テンプレートでは許可されていません。

誰かがこの問題を解決するためのテクニックを持っていますか?

どうもありがとう

4

1 に答える 1

1

GCCプリプロセッサでは、リストが空の場合に可変個引数マクロ引数リストの最後のコンマを削除する特別な構文を使用できます。

#define MACRO(arg, ...) foo(arg, ##__VA_ARGS__)

この例:

MACRO(a,b)   ->  foo(a, b)
MACRO(a)     ->  foo(a )

これをDEFINE_METACLASSマクロに使用して、すべてのケースを一度にカバーできます。

更新: @Dennisが言うように、MSVC ++で元の構文を使用でき、末尾のコンマも生成されません。

于 2011-07-27T19:56:57.550 に答える