首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >是否有一种方法可以指定可变参数包中的所有类作为模板的朋友,以便使用operator=?

是否有一种方法可以指定可变参数包中的所有类作为模板的朋友,以便使用operator=?
EN

Stack Overflow用户
提问于 2015-07-20 07:25:28
回答 1查看 959关注 0票数 8

我看到了一个CRTP溶液,它将接口提取到基类中,并且只为每个基类提供了一个pack参数。然后,大多数派生类继承了所有的好友基类,并实现了接口。

我不能使用这种方法,因为我需要保护赋值操作符,它不是继承的。

另外,由于赋值运算符有一个定义的签名,并且只有一个参数,所以我不能使用键模式

这就是我想要的:

代码语言:javascript
代码运行次数:0
运行
复制
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...;
}

有办法满足我的需要吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-20 10:30:44

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

代码语言:javascript
代码运行次数:0
运行
复制
#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个朋友声明放入您选择的各种类模板中:

代码语言:javascript
代码运行次数:0
运行
复制
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

演示。归功于@dyp。

如果您能够访问Boost.Preprocessor,则可以使用BOOST_PP_REPEAT编写更简洁的整个程序。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31510844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档