2012-12-07 71 views
0

在我的last question我得到了很大的幫助,使模板專業化工作。現在我需要一點點延伸。我想這些語句兩個專業:模板專業化與多種可變模板

int main() 
{ 
    // First specialization 
    holder_ext<person> h1; 
    holder_ext<person, &person::age> h2; 
    holder_ext<int> h3; 

    // Second specialization 
    holder_ext<person, &person::age, &person::name> h4; 
} 

我班的人看起來是這樣的:

class person 
{ 
private: 
    std::string name_; 
    int age_; 
public: 
    person(const std::string &name) 
     : name_(name), age_(56) 
    {} 
    void age(int a) { age_ = i; } 
    void name(const std::string &n) { name_ = n; } 
}; 

的特別之處在於,這兩個成員函數有不同的參數類型。所以我不能爲兩者使用相同的可變模板成員函數。我嘗試了兩種不同的可變模板。但那不行。成員函數的默認值也不起作用。

有沒有人對我有好的提示?

這是一個成員函數的解決方案(感謝Pubby):

template < class T, void (std::conditional<std::is_class<T>::value, T, struct dummy>::type::* ...FUNC)(int)> class holder; 

template < class T, void (T::*FUNC)(int)> 
class holder<T, FUNC> 
{ 
public: 
    explicit holder() : setter(FUNC) { std::cout << "func\n"; } 
private: 
    std::function<void (value_type&, int)> setter; 
}; 

template < class T> 
class holder<T> 
{ 
public: 
    explicit holder() { std::cout << "plain\n"; } 
}; 

再次感謝提前!

P.S .:不,我不會在兩天內提出「必須處理三,四,五個成員函數」嗎? ;-)

回答

0

最後,我找到了我的問題的解決方案。它是可變模板和模板特化之間的混合:

template < class T, 
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::*FUNC1)(int) = nullptr, 
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::* ...FUNC2)(const std::string&) 
> 
class holder_ext; 

template < class T, 
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::*FUNC1)(int), 
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::*FUNC2)(const std::string&) 
> 
class holder_ext<T, FUNC1, FUNC2> 
{ 
public: 
    holder_ext() { std::cout << "func 2 test\n"; } 
}; 

template < class T, 
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::*FUNC1)(int) 
> 
class holder_ext<T, FUNC1> 
{ 
public: 
    holder_ext() { std::cout << "func 1 test\n"; } 
}; 

我使用未實現的聲明並定義兩個特化。一個具有成員函數,另一個具有所有其他情況。

如果有更好的解決方案不要猶豫,告訴我。

0

對於完全通用的解決方案,您將遇到無法解決的問題:無法推斷非類型模板參數的類型,因此它必須在模板聲明中顯式指定,所以沒有辦法告訴模板你需要多個指針 - 成員參數,每個參數都有一個未知的類型。

我還沒有與C++ 11足夠的發揮,但你可以嘗試迫使有關成員模板參數排序,並在模板中提供的所有簽名:

template <typename T, 
      void (std::conditional<...>::type*)(int), 
      void (std::conditional<...>::type*)(const std::string&)> 

再次,它可能工作也可能不會...

+0

我嘗試了類似的解決方案,但可能不完全相同的變體。所以我會試試這個。 – zussel