在我的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 .:不,我不會在兩天內提出「必須處理三,四,五個成員函數」嗎? ;-)
我嘗試了類似的解決方案,但可能不完全相同的變體。所以我會試試這個。 – zussel