2010-09-19 95 views
1

我有以下代碼:C++:使用函數指針作爲模板參數

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'

是否有可能以某種方式解決這一問題?或者爲什麼這是不可能的?

+0

這些都不是普通的函數指針,這些指針到成員函數,所以你必須使用指針到成員的語法。 – 2010-09-19 17:50:14

回答

2

你想

Property<Entry, T1, &Entry::set1, &Entry::get1> 
+0

你認爲編譯器的錯誤信息可以改進嗎?只是好奇 – Chubsdad 2010-09-20 03:25:56

+0

@Chubsdad我很確定它可以。一個實現知道'set1'指向一個非靜態成員函數,並且知道它試圖初始化一個指向成員的指針。我懷疑GCC只是不在乎。 – 2010-09-20 10:48:47