gpt4 book ai didi

c++ - 具有多个可变参数模板的模板特化

转载 作者:太空宇宙 更新时间:2023-11-04 14:12:01 24 4
gpt4 key购买 nike

在我的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.:不,我不会在两天内提出“三、四、五个成员函数必须做什么”? ;-)

最佳答案

对于完全通用的解决方案,您会遇到一个无法解决的问题:无法推断非类型模板参数的类型,因此它必须在模板声明中明确显示,因此无法告诉模板您需要多个指向成员的指针参数,每个参数都具有未知类型。

我对 C++11 的使用还不够多,但您可以尝试强制对成员模板参数进行排序并在模板中提供所有签名:

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

同样,它可能有效也可能无效...

关于c++ - 具有多个可变参数模板的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13764418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com