2010-06-03 69 views
3

提供模板特我有以下情形:Smplest方式爲派生類

class my_base { ... } 

class my_derived : public my_base { ... }; 


template<typename X> 
struct my_traits. 

我想專門my_traitsmy_base派生的所有類,包括:即

template<typname Y> // Y is derived form my_base. 
stryct my_traits { ... }; 

我沒有問題補充任何標籤,成員my_base使其更簡單。我看到了一些竅門,但我仍然感到迷失。

這怎麼能做到簡單又短路?

+0

重複http://stackoverflow.com/questions/281725/template-specialization-based-on-inherit-class,如果這足夠好。 – Beta 2010-06-03 18:06:05

+0

@貝塔,是不是有更簡單的方法?因爲我可以隨意更改my_base,所以也許它可以在沒有IsBaseOf的情況下完成? – Artyom 2010-06-03 18:12:44

+0

在c + + 11簡單:http://stackoverflow.com/a/25934222/1132686 – 2014-10-02 13:17:33

回答

1

那麼,你不需要寫自己的isbaseof。你可以使用boost或C++ 0x。

#include <boost/utility/enable_if.hpp> 

struct base {}; 
struct derived : base {}; 

template < typename T, typename Enable = void > 
struct traits; 

template < typename T > 
struct traits< T, typename boost::enable_if<std::is_base_of<base, T>>::type > 
{ 
    enum { value = 5 }; 
}; 

#include <iostream> 
int main() 
{ 
    std::cout << traits<derived>::value << std::endl; 

    std::cin.get(); 
} 

有縮放的問題,但我不認爲他們比其他問題的選擇更好或更差。

+0

謝謝......它看起來沒有什麼簡單的周圍,但這些至少是用一行(和少數標題) – Artyom 2010-06-03 18:23:26