gpt4 book ai didi

c++ - 确定类型是否派生自 CRTP 基类

转载 作者:太空狗 更新时间:2023-10-29 21:29:21 25 4
gpt4 key购买 nike

我正在尝试创建一个 is_foo 函数,然后我可以将其与 enable_if 一起使用,以确定某个类型是否派生自某个 CRTP 基类。下面的代码是我尝试实现 is_foo 函数,但它实际上并没有起作用。谁能告诉我需要更改什么才能修复它?

谢谢。

#include <iostream>
#include <type_traits>
#include <functional>

using namespace std;

template <class Underlying, class Extra>
struct Foo
{
int foo() const { return static_cast<const Underlying*>(this)->foo(); }
};

template<class T>
struct Bar : Foo<Bar<T>, T>
{
int foo() const { return 42; }
};

template<class T>
struct is_foo { static const bool value = false; };

template<class Underlying, class Extra>
struct is_foo<Foo<Underlying, Extra> > { static const bool value = true; };

template<class T>
void test(const T &t)
{
cout << boolalpha << is_foo<T>::value << endl;
}

int main()
{
Bar<int> b;
test(b);
}

最佳答案

向 Foo 基添加一个 typedef:

template < typename Derived >
struct crtp
{
...
typedef int is_crtp;
};

实现 has_field 检查:

BOOST_MPL_HAS_XXX(is_crtp)

实现你的元函数:

template < typename T >
struct is_crtp_derived : has_is_crtp<T> {};

这是我能想到的唯一能正确抓到孙子的方法。不过,它很容易出现误报,因此您会希望选择的名字太令人讨厌,以免在其他地方意外使用。您的另一个选择是根据 is_base_of 实现您的元函数:

template < typename T >
struct is_crtp_derived : std::is_base_of< crtp<T>, T> {};

这当然抓不到孙子了。

关于c++ - 确定类型是否派生自 CRTP 基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5072916/

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