C++ Mixin,检查模板类型是否实现了特定的 mixin
C++ Mixin, check if templated type implements certain 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;
}
你可以这样做:
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.
如果存在 U
使得 T
继承自 Z<U>
,我们认为 mixin 已实现。所以 implements_mixin<Colorable, Test>::type
是 std::false_type
,但是 implements_mixin<StaticText, Text>::type
是 std::true_type
。
给定一个看起来像这样的代码片段,我如何编写一个函数来检查给定对象是否实现了某个混合?我尝试使用指针转换,但由于它们具有相同的基础,因此每个结果都是非空的,但我猜测有一个模板化的解决方案,但找不到我可以实现的任何解决方案。
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;
}
你可以这样做:
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.
如果存在 U
使得 T
继承自 Z<U>
,我们认为 mixin 已实现。所以 implements_mixin<Colorable, Test>::type
是 std::false_type
,但是 implements_mixin<StaticText, Text>::type
是 std::true_type
。