2015-11-24 20 views
3

有沒有辦法檢測到,如果structtypedef哪個沒有被繼承?檢測非繼承typedef的特質

,下面的代碼失敗在C

#include <iostream> 

struct A { }; 
struct B : public A { typedef A Base; }; 
struct C : public B {}; 

template<typename T> 
struct to_void 
{ 
    typedef void type; 
}; 

template <typename T, typename dummy = void> 
struct has_base_typedef : std::false_type {}; 

template <typename T> 
struct has_base_typedef<T, typename to_void<typename T::Base>::type> : std::true_type {}; 

int main() 
{ 
    std::cout << has_base_typedef<A>::value; 
    std::cout << has_base_typedef<B>::value; 
    std::cout << has_base_typedef<C>::value; 
} 

特徵爲Ctrue因爲Base是繼承(private修改不利於AFAIK)

我的目標是讓片斷打印010

Small example玩ideone。

回答

0

基本上,你想阻止Base別名的隱式傳播到派生類,我認爲這是不可能的。我能想到的東西實現接近你想要什麼的唯一方式如下:

struct C; 

struct A {}; 
struct B : public A { 
    using Base = A; 
    using Derived = C; 
}; 
struct C : public B { }; 

template<typename T> 
struct to_void { 
    typedef void type; 
}; 

template <typename T, typename dummy = void> 
struct has_base_typedef : std::false_type {}; 

template <typename T> 
struct has_base_typedef<T, std::enable_if_t<!std::is_same<typename T::Derived, T>::value, 
          typename to_void<typename T::Base>::type>> : std::true_type {}; 

Live Demo

+1

OP預期'010'並得到了[101010](http://stackoverflow.com/用戶/ 2352671/101010):-) – Jarod42

+0

@ Jarod42不錯的一個傢伙。 – 101010

+0

謝謝你的答案,不幸的是,這不是我查找的一般方法。派生類可能不止一個(必​​須使用類型列表),結構可以在一個庫中,當創建新的派生類時不應該(不能)修改... – relaxxx