Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C++中为多个类类型指定相同的模板成员函数?_C++_Function_Templates_Macros - Fatal编程技术网

如何在C++中为多个类类型指定相同的模板成员函数?

如何在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

为了避免大量键入,我想为多个类定义一个函数。我希望模板系统能够为每个模板提供定义。我想一个非平凡的宏也可以实现这一点,但它们似乎不太受欢迎。由于其复杂性,我不希望在可以为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; } 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,谢谢你的代码,但是我应该从问题中排除这种形式的继承。我编辑了这个问题以反映这一点。答案似乎是不可能的。