gpt4 book ai didi

c++ - 相互依赖的类模板和 std::is_base_of 特化

转载 作者:行者123 更新时间:2023-11-30 05:00:01 26 4
gpt4 key购买 nike

我对以下情况感到有点困惑,我在 is_base_of 上启用了特化。

is_base_of 需要被检查的类型的完整定义是可用的。但是,正在专门化的类型被用作正在检查的基类类型的成员 - 因此两者都需要在另一个之前定义,我不能转发声明继承关系。

令人困惑的是,如果我改为标记基础并启用此现有标记,它就可以工作。当然,要使其起作用,此时必须知道继承关系。那么为什么 is_base_of 在没有可用的完整定义的情况下不起作用?

#define OPTION 2 // OPTION 2 : broken, OPTION 1 : works

#include <iostream>
#include <type_traits>
using namespace std;


template <typename T,typename Enable=void>
struct child;

template <typename T>
struct base
{
typedef T type;

#if OPTION ==1
struct base_tag{};

#endif

};


#if OPTION ==2
template <typename T>
struct child < T, typename std::enable_if < std::is_base_of< base<typename T::type>, T>::value>::type>
{

const char* value = "specialization";
};
#else

template <typename T>
struct child < T, std::void_t<typename T::base_tag> >
{

const char* value = "specialization";
};

#endif



template <typename T>
struct dervived : base<T>
{
child<dervived> child_;
typedef T type;
};



int main() {


std::cout << dervived<int>().child_.value << std::endl;
return 0;
}

DEMO

最佳答案

std::is_base_of需要完整的类型。

template <typename T>
struct derived : base<T>
{
child<derived> child_; // derived<T> not yet complete here.
typedef T type;
};

对于 T::base_tag , IIRC(我认为 child<derived> 的 POI 从 struct derived 之前移动到类(class)中的当前位置),T不需要完整,访问过的部分可见。

所以 derived::type将不可见。 (但 derived::base::type 会是)。

关于c++ - 相互依赖的类模板和 std::is_base_of 特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50968491/

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