如何在C++中为多个类类型指定相同的模板成员函数?
为了避免大量键入,我想为多个类定义一个函数。我希望模板系统能够为每个模板提供定义。我想一个非平凡的宏也可以实现这一点,但它们似乎不太受欢迎。由于其复杂性,我不希望在可以为S1、S2创建基类的地方使用继承如何在C++中为多个类类型指定相同的模板成员函数?,c++,function,templates,macros,C++,Function,Templates,Macros,为了避免大量键入,我想为多个类定义一个函数。我希望模板系统能够为每个模板提供定义。我想一个非平凡的宏也可以实现这一点,但它们似乎不太受欢迎。由于其复杂性,我不希望在可以为S1、S2创建基类的地方使用继承 struct S1 { bool print(int i); }; struct S2 { bool print(int i); }; // bool S1::print(int i) { i=+1; std::cout<<i; return true; } NO
struct S1 {
bool print(int i);
};
struct S2 {
bool print(int i);
};
// bool S1::print(int i) { i=+1; std::cout<<i; return true; } NOTE: this is the line I don't want to type many times for each S*
template< typename T >
bool T::print(int i) { i=+1; std::cout<<i; return true; } // TODO
int main() {
S1 s1 {};
s1.print( 5 );
}
不能使用模板注入自由函数,使其成为多个独立类的成员函数。对不起,事情不是这样的 如果您非常想这样做,可以通过继承来实现:
#include <iostream>
struct Base {
public:
bool print() {
std::cout << "Printing something\n";
return true;
}
};
struct S1 : Base { };
struct S2 : Base { };
int main() {
S1 s1;
s1.print();
S2 s2;
s2.print();
}
但请注意:继承本身带来了一系列问题,因此您是否真的想这样做还有待商榷。您不能使用模板来注入自由函数,使其成为许多独立类的成员函数。对不起,事情不是这样的 如果您非常想这样做,可以通过继承来实现:
#include <iostream>
struct Base {
public:
bool print() {
std::cout << "Printing something\n";
return true;
}
};
struct S1 : Base { };
struct S2 : Base { };
int main() {
S1 s1;
s1.print();
S2 s2;
s2.print();
}
但是请注意:继承本身带来了一系列问题,因此您是否真的想这样做还是有疑问的。类似的事情呢
struct function
{
bool print(int i);
}
struct s1: public function
{
}
现在您可以从s1使用打印功能了。这样的功能怎么样
struct function
{
bool print(int i);
}
struct s1: public function
{
}
现在您可以从s1开始使用打印功能。我们可以假设打印在现实生活中要复杂得多吗?目前,它没什么用,要就如何最好地得到你想要的东西提出一个好的建议,因为你不能做你正在尝试的事情,我想我们需要更多的细节。告诉我为什么继承不适合你的需要,给定:1到目前为止,继承作为两个答案中的混合使s1.print 5之类的东西在语法上工作,调用函数,并保存键入。2这样的实现可能就这么简单。。。打印i。艾德:这样说吧。如果符合您所有规范的继承不起作用,我怎么知道我的神秘宏/模板方法有效?如果您只想打印I,而函数没有从类中获得任何信息,那么让函数自由使用。除非函数使用这个函数,否则它成为类成员的唯一原因是美学;他什么也没做。i通过值传递,因此函数中的i是调用方参数的副本。将其设置为1对外部世界没有影响。我感谢大家的评论,这个问题的原因与在c++17中使用std::variant有关。我发现自己经常重复代码,这会对我有所帮助,但这似乎是不可能的。在某些情况下,可以使用Std::variant代替继承运行时多态性。S1和S2是不同的,我们可以假设打印在现实生活中要复杂得多吗?目前,它没什么用,要就如何最好地得到你想要的东西提出一个好的建议,因为你不能做你正在尝试的事情,我想我们需要更多的细节。告诉我为什么继承不适合你的需要,给定:1到目前为止,继承作为两个答案中的混合使s1.print 5之类的东西在语法上工作,调用函数,并保存键入。2这样的实现可能就这么简单。。。打印i。艾德:这样说吧。如果符合您所有规范的继承不起作用,我怎么知道我的神秘宏/模板方法有效?如果您只想打印I,而函数没有从类中获得任何信息,那么让函数自由使用。除非函数使用这个函数,否则它成为类成员的唯一原因是美学;他什么也没做。i通过值传递,因此函数中的i是调用方参数的副本。将其设置为1对外部世界没有影响。我感谢大家的评论,这个问题的原因与在c++17中使用std::variant有关。我发现自己经常重复代码,这会对我有所帮助,但这似乎是不可能的。在某些情况下,可以使用Std::variant代替继承运行时多态性。S1和S2处于同一位置variant@AndyG:到目前为止,他所说的一切都没有表明需要/使用CRTP。如果print需要使用S1/S2中定义的东西,它将变得很有用。@JerryCoffin,谢谢你的代码,但是我应该从问题中排除这种形式的继承。我编辑了这个问题以反映这一点。看来答案是这是不可能的。@AndyG:到目前为止,他所说的一切都没有表明需要/使用CRTP。如果print需要使用S1/S2中定义的东西,它将变得很有用。@JerryCoffin,谢谢你的代码,但是我应该从问题中排除这种形式的继承。我编辑了这个问题以反映这一点。答案似乎是不可能的。