オブジェクトのセットをインスタンス化して初期化するために使用されるメソッドのセットがあります。Init関数に渡される引数の数を除いて、それらはすべてほとんど同じように見えます。
ObjectType* CreateObjectType(Arg1 a1, Arg2 arg2, ... ArgN aN)
{
ObjectType* object = new ObjectType();
[...]
object->Init(this, a1, a2, ..., aN);
[...]
return object;
}
引数は、 Init関数に渡す以外の場所では使用しないことに注意してください。
オブジェクトの種類ごとにコードを複製することなく、これらすべてを実装する方法を見つけたいと思います。
次の(無効な)結果で、可変長マクロを使用してみました:
#define CREATE_OBJECT_IMPL(ObjectType, ...) \
ObjectType* Create##ObjectType##(__VA_ARGS__) \
{ \
ObjectType* object = new ObjectType(); \
[...]
object->Init(this, ##__VA_ARGS__); \
[...]
return object; \
}
// This is the result I am trying to achieve :
CREATE_OBJECT_IMPL(MyFirstObject, bool, float)
CREATE_OBJECT_IMPL(MySecondObject, int)
CREATE_OBJECT_IMPL(MyThirdObject)
さて、この実装では、VA_ARGS を 2 回使用しましたが、どちらも間違っています。
最初のケースでは、指定した型 (Arg1 a1、Arg2 a2...) の引数のリストが必要です。
2 番目のケースでは、これらの引数を名前 ( Init(a1, a2...) ) で呼び出したいと思います。
可変個引数テンプレートを使用してみました:
template< typename ObjectType, typename... Args >
ObjectType* CreateObject(Args args)
{
ObjectType* object = new ObjectType();
[...]
object->Init(this, args);
[...]
return object;
}
#define CREATE_OBJECT_IMPL(ObjectType, ...) \
ObjectType* Create##ObjectType##(__VA_ARGS__) \
{ \
return CreateObject<ObjectType, __VA_ARGS__>(__VA_ARGS__); \
}
...しかし、これもうまくいかないようです。テンプレート定義行で次のエラーが発生します。
エラー C2143: 構文エラー: '...' の前に ',' がありません
エラー C2065: 'Args': 宣言されていない識別子
私はVS2012を使用しています。
引数の数ごとに N 個の同様のマクロを記述できますが、コードを複製せずに同じ結果を得る方法があるかどうか疑問に思っていました。