2016-12-28 213 views
-2

我希望能够遍历从共同祖先继承的类的列表。遍历类列表

什么,我想(类Python语法,因为这是我来自语言)精缩版:

const *Player *PLAYERS[3] = { *PlayerTypeOne, *PlayerTypeTwo, *PlayerTypeThree}; 

int outcome = 0; 

for player in players { 
    if (doThingWithPlayer((&player)(), some, other, variables) == true) { 
     outcome++; 
    } 
} 

如果这不是在做这种操作的首选方式,咨询如何我应该继续非常欢迎。

排序的代码,我想避免的是:

int outcome = 0; 

PlayerTypeOne player_one(); 
if doThingWithPlayer(player_one, some, other, variables){ 
    outcome++; 
} 
PlayerTypeTwo player_two(); 
if doThingWithPlayer(player_two, some, other, variables){ 
    outcome++; 
} 
PlayerTypeThree player_three(); 
if doThingWithPlayer(player_three, some, other, variables){ 
    outcome++; 
} 
+0

类的列表类的实例(即对象)的列表? – NPE

+1

你混淆了'object'和'class'这两个词吗? –

+0

@NPE类的列表 – muddyfish

回答

1

你正在寻找一个factory design pattern

Player *create_by_name(const std::string &what) 
{ 
    if (what == "PlayerTypeOne") 
     return new PlayerTypeOne; 
    if (what == "PlayerTypeTwo") 
     return new PlayerTypeTwo; 

    // ... 
} 

等。你也似乎想要做的是为每个子类的构造函数提供参数。

如果所有子类都采用相同的构造函数参数,则这变得很简单:将参数传递给工厂,并将它们转发给构造函数。

如果您需要支持构造函数的不同参数,这会变得更加复杂。我建议你从小处着手,为你的对象实现一个简单的工厂,不需要构造器参数,或者仅仅对于所有子类都是相同的。一旦你的基本原则奏效,那么你可以担心处理复杂的角落案件。

然后,只需要一个类名的数组,迭代数组,然后调用工厂。这应该与您的伪Python代码具有相似的结果。

+4

原始指针:( –

1

C++不提供内置内省,因此您不能只获取表示类的对象并使用它们创建实例。

你可以做的是使用元编程:

// A list of types 
template <class...> struct pack { }; 

// Calls f with one default-constructed instance of each T 
template <class... Ts, class F> 
void construct_each(pack<Ts...>, F &&f) { 

    // Classic pre-C++17 expansion trick 
    using ex = int[]; 
    (void)ex{(f(Ts{}), void(), 0)..., 0}; 

    // C++17 version 
    // (void)(f(Ts{}), ...); 
} 

// ... 

using Players = pack<PlayerTypeOne, PlayerTypeTwo, PlayerTypeThree>; 

void foo() { 
    int outcome = 0; 

    construct_each(Players{}, [&](auto &&player) { 
     if(doThingWithPlayer(player, some, other, variables)) 
      ++outcome; 
    }); 
} 

See it live on Coliru