5

不明な数のポリシーテンプレートパラメーターを受け取るテンプレートクラスPolicyDrivenClassにポリシーとして渡す一連の同種のポリシークラスがあります。

各ポリシーは「name」関数を実装しており、実行時にPolicyDriveClass::getNamesを介してすべてのポリシーの名前を照会できるようにしたいと思います。

実装は機能していますが、特に最終的な設計では、ポリシークラスが「名前」に似たいくつかの関数を実装しますが、リターンタイプは異なる可能性があり、ポリシードリブンクラスは同様のアクセサーを提供する必要があるため、不格好に感じます。これらの各関数の「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);
}
4

1 に答える 1

7

あなたが正しいです。名前のリストを取得する簡単な方法があります。以下はGCC-4.7で動作します。

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

編集:関数の宣言部分を古い構文に変更しました。個人的に、私は新しい構文を好みます:

    auto getNames() const -> std::deque<std::string>;
于 2012-06-07T13:12:54.780 に答える