我有一组同类策略类,我想将它们作为策略传递给模板类PolicyDrivenClass,它需要一些未知数量的策略模板参数。
每个策略都实现了一个“名称”功能,我希望能够通过PolicyDriveClass :: getNames在运行时查询所有策略的名称。
我有一个可行的实现,但它感觉很笨,特别是考虑到在我的最终设计中,Policy类将实现类似于“name”的几个函数,尽管可能具有不同的返回类型,并且我的策略驱动类将需要为每个函数提供类似于“getNames”的访问器。
我的问题是,是否有人可以为此提出更好的实施方案。
值得我使用的是clang ++。我的g ++版本不喜欢这个。
这是我到目前为止所拥有的:
#include <string>
#include <deque>
#include <algorithm>
#include <iterator>
#include <iostream>
using namespace std;
template<typename... Policies>
class PolicyDrivenClass
{
public:
template<typename T, typename... Types>
class NameExtractor
{
public:
static deque<string> getNames()
{
deque<string> names = NameExtractor<Types...>::getNames();
names.push_front(T::name());
return names;
}
};
template<typename T>
class NameExtractor<T>
{
public:
static deque<string> getNames()
{
deque<string> ret;
ret.push_back(T::name());
return ret;
}
};
deque<string> getNames() const
{
return NameExtractor<Policies...>().getNames();
}
};
class Policy1
{
public:
static string name(){return "policy 1";}
};
class Policy2
{
public:
static string name(){return "policy 2";}
};
class Policy3
{
public:
static string name(){return "policy 3";}
};
int main()
{
PolicyDrivenClass<Policy1, Policy2, Policy3> c;
deque<string> names = c.getNames();
ostream_iterator<string> out (cerr,"\n");
copy(names.begin(), names.end(), out);
}
答案 0 :(得分:6)
你是对的。有更简单的方法来获取名称列表。以下适用于GCC-4.7:
template <typename ...Policies>
struct PolicyDrivenClass
{
std::deque<std::string> getNames() const
{
return { Policies::name()... };
}
};
编辑:将函数的声明部分更改为旧语法。就个人而言,我更喜欢新语法:
auto getNames() const -> std::deque<std::string>;