gpt4 book ai didi

c++ - 在模板类中声明非模板函数?

转载 作者:行者123 更新时间:2023-11-30 02:18:50 25 4
gpt4 key购买 nike

NOTE: this post is different from this one: Declare non-template friend function for template class outside the class, so please read my question before marking it as duplicate.

我想在类模板中声明一个非模板友元函数,并且该友元函数的参数和返回类型与模板参数无关。我应该怎么做?

请注意它与上一个问题不同,因为在那个问题中,友元函数的参数和返回类型与模板参数相关

示例,改编自上述问题:

// class.h
#include <iostream>
using namespace std;

template <typename T>
struct B
{
T value;
int value2;
B() : value2(1) {}
friend void modify(const int&); // unrelated to T!
void printValue2() {
modify(value2);
cout << value2 << endl;
}
};

// define friend function foo() in a class.cpp file, not in the header
void modify(const int &v) { v = v * 2 + 1; } // HOW should I write it?

// main.cpp
int main() {
B<int> b;
b.printValue2();
return 0;
}

我知道我可以在这个模板类之外声明 modify(),这样它就变成了普通的普通函数。但我只希望这个模板类能够访问 modify()。或者,为了实现访问控制的这一目标,我可以将 modify() 定义为该模板类中的静态方法,但这会使该方法成为模板方法,迫使我将其定义在标题。

跟进:如果上面的 friend 方法不行,我应该如何同时实现两个目标:

  • 访问控制:只有那个类模板可以访问modify()
  • 能够在 *.cpp 文件中定义 modify(),而不是在 header 中。

接受的答案:

要实现上述两个目标,请不要滥用友元。

最佳实践是让类模板私有(private)继承一个非模板基类,并在该基类中声明与模板无关的公共(public)非模板方法参数。

因此,您可以在单独的 *.cpp 文件中定义这些方法,从而减小 header 的大小。

最佳答案

你可以使用私有(private)继承而不是友元:

// class.h
#include <iostream>

class B_helper
{
protected:
static void modify(int &v);
};

template <typename T>
struct B : private B_helper
{
T value;
int value2;
B() : value2(1) {}

void printValue2() {
modify(value2);
std::cout << value2 << std::endl;
}
};

// class.cpp
void B_helper::modify(int &v) { v = v * 2 + 1; }

关于c++ - 在模板类中声明非模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51776227/

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