C ++ Mixin,检查模板类型是否实现某些mixin

时间:2017-04-22 18:41:01

标签: c++ mixins

给定一个看起来像这样的代码片段,如何编写一个函数,检查给定的对象是否实现了某个混合?我尝试使用指针转换,但由于它们具有相同的基础,每个resoult都是非null,但我猜有一个模板化的解决方案,但无法找到任何我可以实现的。

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 个答案:

答案 0 :(得分:3)

你可以这样做:

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.

如果存在UT继承自Z<U>,我们会考虑实施mixin。因此implements_mixin<Colorable, Test>::typestd::false_type,但implements_mixin<StaticText, Text>::typestd::true_type