2017-04-22 93 views
1

給定一個看起來像這樣的代碼片段,我該如何編寫一個函數來檢查給定對象是否實現了某個混合?我嘗試使用指針鑄造,但由於他們有相同的基礎每個resoult是非空的,但我猜測有一個模板化的解決方案,但找不到任何我可以實現。C++ Mixin,檢查模板類型是否實現了特定的混合

class Widget{ 
public: 
    int px; 
    int py; 
}; 

template <typename Base> 
class StaticText : public Base{ 
public: 
    std::string text; 
}; 

template <typename Base> 
class Alignable : public Base{ 
public: 
    std::string alignment; 
}; 

template <typename Base> 
class Colorable : public Base{ 
public: 
    std::string color; 
}; 

typedef Alignable<StaticText<Widget>> Text; 

int main(){ 
    auto w = std::make_unique<Text>(); 

    // if(w == Colorable...) 
    // if(w == Alignable...) 

    std::cin.get(); 
    return 0; 
} 
+1

嗯,不應該'if(dynamic_cast (ptr)!= nullptr){}'工作嗎? – Vorac

+2

@Vorac'Colorable'是一個帶有(大概未知)參數的模板類型。它必須是'if(dynamic_cast >(ptr)!= nullptr){}'但'T'可以是任何東西。 – cdhowie

+0

@cdhowie確實,我們說mixin,所以它可能是着色>。我的錯。 – Vorac

回答

3

你可以做這樣的事情:如果從Z<U>存在U,從而T繼承

template <template <class> class Z, class T> 
class implements_mixin 
{ 
    template <class U> 
    static std::true_type test(Z<U>*); 
    static std::false_type test(...); 

public: 
    using type = decltype(test(std::declval<T*>())); 
    static constexpr bool value = type::value;   
}; 

template <class T> 
using isColorable = implements_mixin<Colorable, T>; 

// etc. 

,我們認爲,混入實施。所以implements_mixin<Colorable, Test>::typestd::false_type,但是implements_mixin<StaticText, Text>::typestd::true_type

+0

'template using Colorable = implements_mixin ;'result in'error:'Colorable'的重新定義爲不同類型的符號。也許我們應該把它叫做「is_Colorable」。 – cdhowie

+0

@cdhowie是的,這是我得到的不編譯... – Barry

相關問題