gpt4 book ai didi

c++ - 使用模板将一组成员函数声明为友元

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:58 25 4
gpt4 key购买 nike

给定以下代码:

class A;

struct B {
static void doIt(A* pa);
};

struct C {
static void doIt(A* pa);
};

class A {
int i = 9;
// below works but requires a line per each type
friend void B::doIt(A* pa);
friend void C::doIt(A* pa);

// the below however doesn't work
// template<typename T>
// friend void T::doIt(A* pa);
// (gcc error: member 'void T::doIt(A*)' declared as friend before type 'T' defined)
// (clang just ignores the above and the error is on accessing A::i in B and C)
};

void B::doIt(A* pa) {
cout << pa->i << endl;
}

void C::doIt(A* pa) {
cout << pa->i *2 << endl;
}

int main() {
A a;
B::doIt(&a);
C::doIt(&a);
}

是否可以替换多个 friend 声明以允许所有 void T::doIt(A* pa) 方法访问 A< 的私有(private)成员?

尝试在 A 之上实例化 BC 没有帮助。

最佳答案

不完全是你问的是什么,但是......如果你模板化 BC 等结构,你可以得到类似的东西。

#include <iostream>

class A;

template <std::size_t>
struct X
{ static void doIt(A* pa); };

class A
{
int i = 9;

template <std::size_t I>
friend void X<I>::doIt (A* pa);
};

template <>
void X<0U>::doIt(A* pa)
{ std::cout << pa->i << std::endl; }

template <>
void X<1U>::doIt(A* pa)
{ std::cout << pa->i * 2 << std::endl; }

template <>
void X<2U>::doIt(A* pa)
{ std::cout << pa->i * 3 << std::endl; }

using B = X<0U>;
using C = X<1U>;
using D = X<2U>;

int main() {
A a;
B::doIt(&a);
C::doIt(&a);
D::doIt(&a);
}

关于c++ - 使用模板将一组成员函数声明为友元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41924069/

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