gpt4 book ai didi

c++ - boost::is_same 与模板化基类

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

我对以下问题感到困惑。我想写一些特征结构来测试某个类是否派生自另一个类。这可以通过 boost::is_base_of<> 来解决。但是,我要测试的基类有一个未定义的模板参数。

下面是一些代码示例:

template<typename T> class Base {};

class IntDeriv : Base<int> {};

class Foo {};

template< class TestClass >
struct is_derived_from_Base {
// how to create something that does the following and forces the compiler to deduce T
static const bool value = boost::is_base_of< Base<T> , TestClass >::value;
};

int main() {
cout << is_derived_from_Base<Foo> << endl; // should print 0
cout << is_derived_from_Base<IntDeriv> << endl; // should print 1
}

问题是如何推断T对于 Base<T>里面is_base_of .这可能吗?我闻到了一些 enable_if 的味道,但我不确定如何将它们放在一起。

最佳答案

你想要的是可能的。使用的技巧在 C++03 中是可能的,但由于您没有指定,我会给您 C++11 版本(使用 decltype,在 C++03 中不可用):

template<class TestClass>
struct is_derived_from_Base
{
template<typename T>
static std::true_type inherited(Base<T>*);
static std::false_type inherited(void*);

static const bool value = decltype(inherited(new TestClass()))::value;
};

你可以看到一个live version here .

那么,它是如何工作的呢?

当结构被实例化并且value需要,编译器将获得 inherited(new TestClass()) 的返回类型.这将调用适当的函数:if TestClass继承Base<T> , 然后 TestClass* (由 new 返回)可转换为 Base<T>* , T由编译器自动推断。返回类型是 std::true_type .如果TestClass不继承 Base<T> ,然后选择另一个重载,返回类型为std::false_type .其余的很简单:std::true_type::value = truestd::false_type::value = false .

还有一些极端情况:

  • 使用私有(private)继承会导致编译错误。我不知道如何解决它,因为我不知道答案:如果 A 私有(private)继承 B,A 是否派生自 B? (一般来说,私有(private)继承被认为是一种实现继承)。另请注意,在这种情况下,A* a = new B();不会编译。
  • 使用私有(private)构造函数会阻止前面解释的技巧正常工作。它将导致编译时错误。由于这违背了此方法的全部要点,因此您将不得不为此类类找到另一种方法。

请注意,您必须按以下方式使用它:is_derived_from_Base<Foo>::value ,不像你写的那样 ( is_derived_from_Base<Foo> )。

关于c++ - boost::is_same 与模板化基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15811555/

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