gpt4 book ai didi

c++ - 扩展两个类的参数的语法

转载 作者:太空狗 更新时间:2023-10-29 20:23:52 24 4
gpt4 key购买 nike

在 Java 中,它是 possible to declare一个参数实现了多个接口(interface)。您必须使用泛型语法,但您可以:

public <T extends Appendable & Closeable> void spew(T t) {
t.append("Bleah!\n");
if (timeToClose())
t.close();
}

在 C++ 中,一种常见的模式是使用仅包含纯虚函数的类作为接口(interface):

class IAppendable {
public:
virtual void append(const std::string&) = 0;
};

class ICloseable {
public:
virtual void close() = 0;
};

编写一个接受 ICloseable 的函数是微不足道的(这只是多态性):

void closeThis(ICloseable&);

但是一个函数的签名是什么,它接受一个参数,就像在 Java 示例中一样,继承自 both ICloseable and IAppendable?

最佳答案

以下是您仅使用标准工具编写它的方式:

template <class T>
std::enable_if_t<
std::is_base_of<IAppendable, T>{} && std::is_base_of<ICloseable, T>{},
void
> closeThis(T &t) {
t.append("end");
t.close();
}

Live on Coliru

如果有更多的基类,我建议制作一个更简洁的类型特征以在 enable_if 中检查它们:

constexpr bool allTrue() {
return true;
}

template <class... Bools>
constexpr bool allTrue(bool b1, Bools... bools) {
return b1 && allTrue(bools...);
}

template <class T, class... Bases>
struct all_bases {
static constexpr bool value = allTrue(std::is_base_of<Bases, T>{}...);

constexpr operator bool () const {
return value;
}
};

template <class T>
std::enable_if_t<
all_bases<T, IAppendable, ICloseable>{},
void
> closeThis(T &t) {
t.append("end");
t.close();
}

关于c++ - 扩展两个类的参数的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31014166/

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