gpt4 book ai didi

C++ - 如何从可变数量的基数中引入重载集。

转载 作者:IT老高 更新时间:2023-10-28 22:30:22 25 4
gpt4 key购买 nike

如果派生类定义了相同的名称,派生类会从基类中隐藏重载集的名称,但我们总是可以使用 using-declaration 引入重载集:

template <class BASE>
class A : public BASE
{
public:
using BASE::some_method;
void some_method();
}

但是,如果我从可变参数基类中引入所有重载集会怎样?我能写出这样的东西吗?

template <class... BASES>
class A : public BASES...
{
public:
using BASES::some_method...;
void some_method();
}

我考虑过使用如下辅助类:

template <class... BASES>
struct helper;

template <>
struct helper<> {};

template <class OnlyBase>
struct helper<OnlyBase> : OnlyBase
{
using OnlyBase::some_method;
};

template <class Base1, class... OtherBases>
struct helper<Base1, OtherBases> : public Base1, public helper<OtherBases...>
{
using Base1::some_method;
using helper<OtherBases...>::some_method;
};

它确实有效。但这需要大量的输入(当然我可以使用宏,但我尽可能使用c++的编译时特性),当我想引入更多方法时,我必须在那段代码中进行大量更改。

一个完美的答案是一个简单的语法,但如果没有,我将使用辅助类。

最佳答案

这里有一个减少笔迹的技巧:

// U<X,Y> is a binary operation on two classes
template<template<class,class>class U, class... Xs> struct foldr;
template<template<class,class>class U, class X> struct foldr<U,X> : X {};
template<template<class,class>class U, class X, class... Xs> struct foldr<U,X,Xs...> : U<X, foldr<U,Xs...>> {};

// our operation inherits from both classes and declares using the member f of them
template<class X, class Y> struct using_f : X,Y { using X::f; using Y::f; };

struct A { void f(int) {} };
struct B { void f(char) {} };
struct C { void f(long) {} };

struct D : foldr<using_f, A, B, C> {};


int main() {
D d;
d.f(1);
d.f('1');
d.f(1L);
return 0;
}

所以我们应该编写一次 foldr,然后编写简单的 ad-hoc 操作 - using_f、using_g、using_f_g

也许有一种方法可以进一步简化。让我想想……

关于C++ - 如何从可变数量的基数中引入重载集。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27183568/

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