gpt4 book ai didi

c++ - 有没有一种方法可以将可变参数包中的所有类指定为模板的友元,以便使用 operator=?

转载 作者:可可西里 更新时间:2023-11-01 18:36:47 25 4
gpt4 key购买 nike

我看到一个CRTP solution ,它将接口(interface)提取到基类中,并且只对每个基类的 pack 参数之一进行友好处理。然后最派生类继承所有友元基类并实现接口(interface)。

我不能使用这种方法,因为我需要保护不能继承的赋值运算符。

此外,由于赋值运算符有一个定义的签名,只有一个参数,我不能使用 key pattern .

这是我想要的:

template <typename... F>
struct A {
protected:
A& operator=(const SomeClass &other) {
//...
}
private:
//I would like to do the following, but it does not work
friend F...;
}

有什么方法可以满足我的需求吗?

最佳答案

好吧,你总是可以玩肮脏的。首先,定义一个重复宏:

#define REPEAT_2(M, N) M(N) M(N+1)
#define REPEAT_4(M, N) REPEAT_2 (M, N) REPEAT_2(M, N+2)
#define REPEAT_8(M, N) REPEAT_4 (M, N) REPEAT_4(M, N+4)
#define REPEAT_16(M, N) REPEAT_8 (M, N) REPEAT_8(M, N+8)
#define REPEAT_32(M, N) REPEAT_16 (M, N) REPEAT_16(M, N+16)
#define REPEAT_64(M, N) REPEAT_32 (M, N) REPEAT_32(M, N+32)
#define REPEAT_128(M, N) REPEAT_64 (M, N) REPEAT_64(M, N+64)

然后将 128 个友元声明放入您选择的可变类模板中:

template <typename... T>
class A
{
#define FRIEND(N) friend std::tuple_element_t<
std::min((std::size_t)N+1, sizeof...(T)), std::tuple<void, T...>>;
REPEAT_128(FRIEND, 0)

static constexpr int i = 3;
};

struct X; struct Y; struct Z;
using ASpec = A<X, Y, Z>;
struct X {int i = ASpec::i;};
struct Y {int i = ASpec::i;};
struct Z {int i = ASpec::i;};

template class A<>; // Small test for empty pack

Demo .感谢@dyp。

如果您有权访问 Boost.Preprocessor,则可以使用 BOOST_PP_REPEAT 将整个内容编写得更加简洁。

关于c++ - 有没有一种方法可以将可变参数包中的所有类指定为模板的友元,以便使用 operator=?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31510844/

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