gpt4 book ai didi

c++ - 帮助类型特征

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:17 25 4
gpt4 key购买 nike

假设我们有以下模板类

template<typename T> class Wrap { /* ... */ };

我们无法改变 Wrap .这很重要。

让有派生自Wrap<T>的类.例如,

class NewInt  : public Wrap<int>     { /* ... */ };
class MyClass : public Wrap<myclass> { /* ... */ };
class Foo : public Wrap<Bar> { /* ... */ };

我们也不能改变这些类。以上所有类(class)都是第 3 方。它们不是我的。

我需要以下编译时间type_traits :

template<class T>
struct is_derived_from_Wrap {
static const bool value = /* */;
};

我需要什么?

assert(is_derived_from_Wrap<Int>::value == true);  // Indeed I need static assert
assert(is_derived_from_Wrap<MyClass>::value == true);
assert(is_derived_from_Wrap<char>::value == false);
struct X {};
assert(is_derived_from_Wrap<X>::value == false);

最佳答案

您可以使用 SFINAE 来做到这一点,但如果您不知道发生了什么,它会很神奇......

template<typename T> class Wrap { };

struct myclass {};
struct X {};

class Int : public Wrap<int> { /* ... */ };
class MyClass : public Wrap<myclass> { /* ... */ };

template< typename X >
struct is_derived_from_Wrap
{
struct true_type { char _[1]; };
struct false_type { char _[2]; };

template< typename U >
static true_type test_sfinae( Wrap<U> * w);
static false_type test_sfinae( ... );

enum { value = sizeof( test_sfinae( (X*)(0) ) )==sizeof(true_type) };
};


#include <iostream>
#define test(X,Y) std::cout<<( #X " == " #Y )<<" : "<<( (X)?"true":"false") <<std::endl;

int main()
{
test(is_derived_from_Wrap <Int>::value, true);
test(is_derived_from_Wrap <MyClass>::value, true);
test(is_derived_from_Wrap <char>::value, false);
test(is_derived_from_Wrap <X>::value, false);
}

这给出了预期的输出

is_derived_from_Wrap <Int>::value == true  : true
is_derived_from_Wrap <MyClass>::value == true : true
is_derived_from_Wrap <char>::value == false : false
is_derived_from_Wrap <X>::value == false : false

我的代码有几个问题。如果类型是 Wrap,它也会返回 true。

assert(  is_derived_from_Wrap< Wrap<char> >::value == 1 );

如果需要,这可能可以使用更多的 SFINAE 魔法来解决。

如果派生不是公共(public)派生(即私有(private)或 protected ),它将返回 false

struct Evil : private Wrap<T> { };
assert( is_derived_from_Wrap<Evil>::value == 0 );

我怀疑这无法修复。 (但我可能是错的)。但我怀疑公共(public)继承就足够了。

关于c++ - 帮助类型特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2062837/

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