gpt4 book ai didi

c++ - 获取基派生自

转载 作者:行者123 更新时间:2023-11-30 02:31:20 25 4
gpt4 key购买 nike

假设我有这样一个类:

template<class T>
class Base{ };

假设我有另一个像这样的类:

template<class T, class Other>
class Derived :
public virtual Base<T>,
public virtual OtherRandomClass<Other>
{ };

有没有办法创建一个模板类来确定 Base(如果有的话)像 Derived 这样的随机类派生自哪个版本?

最佳答案

这是一个可能的解决方案(从 C++11 开始工作 - 好吧,它适用于 C++14,但如果你使用 Base<T> 而不是 auto 作为返回类型,它就适用于 C++11对于 f ):

#include<utility>
#include<type_traits>

template<class T>
class Base{ };

template<class T>
class OtherRandomClass{ };

template<class T, class Other>
class Derived :
public virtual Base<T>,
public virtual OtherRandomClass<Other>
{ };

template<typename T>
constexpr auto f(const Base<T> &b) { return b; }

template<typename T>
struct S {
using type = decltype(f(std::declval<T>()));
};

int main() {
static_assert(std::is_same<typename S<Derived<int, double>>::type, Base<int>>::value, "!");
}

如果 Derived 则不起作用不止一次继承自 Base .
使用 sfinae(类似于 void_t 习语)甚至可以设计一个类似于 enable_if 的类: 它有 type仅当T实际上继承自Base一次。
它将具有以下形式:

template<typename T>
constexpr auto f(const Base<T> &b) { return b; }

template<typename...>
using void_t = void;

template<typename T, typename = void_t<>>
struct S { };

template<typename T>
struct S<T, void_t<decltype(f(std::declval<T>()))>> {
using type = decltype(f(std::declval<T>()));
};

此结构可在编译时用于您能想到的任何模板技巧。

在这两种情况下,S::type (如果存在)是 Derived 的基类类型继承,即Base<T> .
查看 static_assertmain示例的功能以获取更多详细信息。

关于c++ - 获取基派生自,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37901702/

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