gpt4 book ai didi

c++ - 获取 CRTP 继承链中最深的类

转载 作者:太空狗 更新时间:2023-10-29 20:50:05 37 4
gpt4 key购买 nike

我想知道如何解决以下问题 (C++17):假设有几个模板类,它们以类似 CRTP 的方式相互继承(仅限单继承)。对于给定的实例化模板基类,找到继承链中离它最远的类。

我一开始以为这应该很容易,但没能做到这一点。

为简化起见,假设每个根和每个中间类都有using DerivedT = Derived在其 public地区。

例子:

template <class T>
struct GetDeepest {
using Type = ...;
};

template <class T>
struct A {
using DerivedT = T;
};

template <class T>
struct B : public A<B<T>> {
using DerivedT = T;
};

struct C : B<C> {
};

struct D : A<D> {
};

GetDeepest<A<D>>::Type == D;
GetDeepest<B<C>>::Type == C;
GetDeepest<A<B<C>>>::Type == C;
...

我尝试过的第一个实现:

template <class T>
struct GetDeepest {
template <class Test, class = typename Test::DerivedT>
static std::true_type Helper(const Test&);
static std::false_type Helper(...);

using HelperType = decltype(Helper(std::declval<T>()));
using Type = std::conditional_t<std::is_same_v<std::true_type, HelperType>,
GetDeepest<typename T::DerivedT>::Type,
T>;
};

我尝试过的第二个实现:

template <class T>
struct HasNext {
template <class Test, class = typename Test::DerivedT>
static std::true_type Helper(const Test&);
static std::false_type Helper(...);

using HelperType = decltype(Helper(std::declval<T>()));
static const bool value = std::is_same_v<std::true_type, HelperType>;
};

template <class T>
auto GetDeepestHelper(const T& val) {
if constexpr(HasNext<T>::value) {
return GetDeepestHelper(std::declval<typename T::DerivedT>());
} else {
return val;
}
}

template <class T>
struct GetDeepest {
using Type = decltype(GetDeepestLevelHelper(std::declval<T>()));
};

它们都不编译。

第一个——因为 GetDeepest<T> 的类型不完整在声明中using Type = ... ,其次是因为函数的递归调用 auto作为返回类型。

是否有可能实现 GetDeepest<T>具有此类属性的类?现在我很好奇,即使这可能不是完成我想要的事情的最佳方式。

谢谢!

最佳答案

我不确定我是否完全理解这个问题,所以请随时在评论中问我。

但我认为这应该可行:

#include <type_traits>

template<typename T>
struct GetDeepest
{
using Type = T;
};

template<template<typename> class DT, typename T>
struct GetDeepest<DT<T>>
{
using Type = typename GetDeepest<T>::Type;
};

template <class T>
struct A {
using DerivedT = T;
};

template <class T>
struct B : public A<B<T>> {
using DerivedT = T;
};

struct C : B<C> {
};

struct D : A<D> {
};

int main()
{
static_assert(std::is_same<GetDeepest<A<D>>::Type, D>::value);
static_assert(std::is_same<GetDeepest<B<C>>::Type, C>::value);
static_assert(std::is_same<GetDeepest<A<B<C>>>::Type, C>::value);

}

关于c++ - 获取 CRTP 继承链中最深的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56533399/

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