c++ - 使用可变参数模板的基于策略的设计

标签 c++ templates c++11 variadic-templates policy-based-design

我有一组同类策略类,我想将它们作为策略传递给模板类 PolicyDrivenClass,它采用一些未知数量的策略模板参数。

每个策略都实现了一个“名称”函数,我希望能够在运行时通过 PolicyDriveClass::getNames 查询所有策略的名称。

我有一个有效的实现,但感觉很笨拙,特别是考虑到在我的最终设计中,Policy 类将实现几个类似于“name”的函数,尽管可能具有不同的返回类型,而且我的 Policy Driven Class 会想要为每个函数提供类似于“getNames”的访问器。

我的问题是是否有人可以为此提出更好的实现方案。

我使用 clang++ 是为了它的值(value)。我的 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);
}

最佳答案

你是对的。有更简单的方法来获取名称列表。以下适用于 GCC-4.7:

template <typename ...Policies>
struct PolicyDrivenClass
{
    std::deque<std::string> getNames() const 
    {
        return { Policies::name()... };
    }
};

编辑:将函数的声明部分更改为旧语法。就个人而言,我更喜欢新语法:

    auto getNames() const -> std::deque<std::string>;

关于c++ - 使用可变参数模板的基于策略的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10932292/

相关文章:

c++ - NT 文件系统上非常小的文件上的 FSCTL_GET_RETRIEVAL_POINTERS 失败

c++ - C++ 中一个模板函数中使用的类的不常见函数

c++ - 使 std::unique<T> 与 std::unique<const T, CustomDeleterType> 兼容

模板基类的非类型函数模板的 C++ using 声明

c++ - 线程 c++11 标准和 Netbeans/其他 IDE

c++ - 如何在 C++11 中的映射中找到所有等于或高于 KEY_1 且低于 KEY_2 的键?

c++ - 仅为单个函数/文件启用编译器优化

c++ - 如何使用 WriteFile 写入 stderr

c++ - 在我的 switch 语句完全执行之前,我的 while 循环进入第二次迭代,我正在用 c++ 编码

c++ - 是否可以专门研究某些(不是全部)类模板参数?