C ++: использование указателей на функции в качестве аргументов шаблона - PullRequest
1 голос
/ 19 сентября 2010

У меня есть следующий код:

template<typename Parent, typename T, void (Parent::*Setter)(T), T (Parent::*Getter)()>
struct Property {
 Parent& obj;
 Property(Parent& _obj) : obj(_obj) {}
 Property& operator=(T v) { (obj.*Setter)(v); return *this; }
 operator T() { return (obj.*Getter)(); }
};

template<typename T1, typename T2>
class Bimap {
public:
 class Entry;
 typedef std::tr1::shared_ptr<Entry> EntryP; 
 typedef std::multimap<T1, EntryP> T1Map;

 class Entry {
 private:
  Bimap& bimap;
  typename T1Map::iterator it1;

  void set1(T1 v) { bimap.map1.erase(it1); it1 = bimap.map1.insert(typename T1Map::value_type(v, it2->second)).first; }
  T1 get1() { return it1->first; }
 public:
  Property<Entry,T1,set1,get1> first() { return Property<Entry,T1,set1,get1>(*this); }
 };
};

Этот код дает мне (на Property<...> first()):

'void Bimap<T1, T2>::Entry::set1(T1) [with T1 = double, T2 = std::tr1::shared_ptr<Node>]' cannot appear in a constant-expression

Я тоже пробовал с

Property<Entry,T1,&set1,&get1> first() { return Property<Entry,T1,&set1,&get1>(*this); }

но это дает мне:

error: wrong number of template arguments (3, should be 4)
error: provided for 'template<class Parent, class T, void (Parent::* Setter)(T), T (Parent::* Getter)()> struct Property'

Можно ли это как-то исправить? Или почему это невозможно?

1 Ответ

2 голосов
/ 19 сентября 2010

Вы хотите

Property<Entry, T1, &Entry::set1, &Entry::get1>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...