Могут ли классы политики C ++ использоваться для указания существования / несуществования конструкторов? - PullRequest
3 голосов
/ 27 февраля 2010

Предположим, у меня есть:

struct Magic {
  Magic(Foo* foo);
  Magic(Bar* bar);
};

Есть ли способ сделать Magic шаблоном и определить шаблоны классов s.t.

typedef Magic<FooPolicy, ...> MagicFoo;
typedef Magic<BarPolicy, ...> MagicBar;
typedef Magic<..., ...> MagicNone;
typedef Magic<FooPolicy, BarPolicy> MagicAll;

s.t. MagicFoo и MagicAll имеют конструктор Foo *; MagicBar & MagicAll имеет конструктор Bar *; и MagicNone не является ни конструктором Foo *, ни Bar *?

По сути, я хочу, чтобы конструкторы существовали или не существовали на основе классов политики.

Ответы [ 3 ]

4 голосов
/ 27 февраля 2010

Вы можете написать конструктор, принимающий что угодно, а затем делегировать все, что предоставляют политики:

// "Tag" and "No" are used to make the class/function unique 
// (makes the using declarations work with GCC). 
template<int Tag>
struct No { void init(No); };

template<typename P1 = No<0>, typename P2 = No<1>, typename P3 = No<2> >
struct Magic : P1, P2, P3 {
  template<typename T>
  Magic(T t) {
    init(t);
  }

private:
  using P1::init;
  using P2::init;
  using P3::init;
};

Теперь, как только вы передадите аргумент, компилятор определит лучшее соответствие среди политик:

struct IntPolicy { void init(int) { std::cout << "called int!"; } };
struct FloatPolicy { void init(float) { std::cout << "called float!"; } };
Magic<IntPolicy, FloatPolicy> m(0), n(0.0f);
0 голосов
/ 27 февраля 2010

Вы можете иметь определение шаблона для всех политик и специализацию для MagicNone. Примером будет:

template<class T> 
 struct Magic {
  Magic(T *o) {}
};

struct None {};

// specialize for MagicNone
template<> struct Magic<None> {
  Magic() {} // default ctor
};

int main()
{
  int a = 32;
  Magic<int> mi(&a);
  Magic<None> m;
}
0 голосов
/ 27 февраля 2010

Это похоже на приложение для подклассов, а не классов политики. MagicFoo и MagicBar, похоже, хотят быть подклассами Magic, который сам может иметь конструктор protected.

...