Аргумент шаблона после оператора разрешения области не заменяется

Я пытаюсь сделать общий код, который вызовет ошибку компиляции, если B не является предком D. Что я придумал:

template<typename B, typename D>
struct assert_base_of {
enum {value = sizeof(B::D)};
}

Не работает Когда я называю это так:

assert_base_of<A2,A1>::value;

Я получаю следующую ошибку (g ++ 4.8.2):

main.cpp:16:22: error: ‘D’ is not a member of ‘A2’

Похоже, что параметр шаблона D не заменяет A1. Кто-нибудь может объяснить и предложить решение, пожалуйста?

2

Решение

Наследование не включает производный класс в область видимости базового класса, поэтому нет смысла использовать для этого оператор разрешения области. Правильная альтернатива (которая также работает с множественным наследованием) состоит в нарушении правил разрешения перегрузки:

#include <iostream>
#include <type_traits>

template<typename Base, typename Derived,
bool = std::is_same<Base, Derived>::value>
struct is_base_of_impl
{

typedef typename std::remove_cv<Base>::type     no_cv_base;
typedef typename std::remove_cv<Derived>::type  no_cv_derived;template<typename _Up>
static std::true_type test(no_cv_derived&, _Up);
static std::false_type test(no_cv_base&, int);

//Black Magic
struct converter
{
operator no_cv_derived&();
operator no_cv_base&() const;
};

static const bool value = decltype(test(converter(), 0))::value;
};

template<typename Base, typename Derived>
struct is_base_of_impl<Base, Derived, true>
{
static const bool value = std::is_same<Base, Derived>::value;
};

template<typename Base, typename Derived>
struct is_base_of
: public std::integral_constant<bool,
is_base_of_impl<Base, Derived>::value>
{ };struct A {};
struct B1 : A {};
struct B2 : A {};
struct C : B1, B2 {};

int main()
{
std::cout << is_base_of<A, B1>::value << "\n";
std::cout << is_base_of<B1, C>::value << "\n";
std::cout << is_base_of<A, C>::value << "\n";
return 0;
}

Для получения дополнительной информации взгляните на эти ссылки:

Как работает `is_base_of`?

https://groups.google.com/d/msg/comp.lang.c++.moderated/xv4VlXq2omE/—WAroYkW2QJ

3

Другие решения


По вопросам рекламы [email protected]