gpt4 book ai didi

2 种功能类型的 C++ Mixins

转载 作者:行者123 更新时间:2023-11-28 02:56:10 25 4
gpt4 key购买 nike

我正在尝试编写有效的代码:

template <typename... Mixins>
class Checker : public Mixins... {
public:
template<typename... Args>
Checker(Args&&... args) : Mixins(std::forward<Args>(args))... { }

bool check(void) {
bool tests = true;
// TODO: for each Mixins that has Mixin::check
{
tests = tests && Mixin::check();
}

if (!tests) {
// TODO: for each Mixin that has Mixin::handle
{
Mixin::handle()
}
}

return tests
}
};

我只是不知道如何只对那些满足指定成员条件的 Mixin 进行循环。我已经尝试了各种迭代和 enable_if 类型语义的解决方案,但似乎没有任何编译。

额外的

所以,到目前为止我已经尝试过 visa vi for-each base recursion 和 SFINAE 函数消除如下,它无法编译:

template <typename C, typename... Mx>
struct do_checks;

template <typename C>
struct do_checks<C> {
static bool check(C *) {
return true;
}
};


template <typename C, typename E, typename... Mx>
struct do_checks<C, E, Mx...> {
struct general_ { };
struct special_ : general_ { };
template <typename> struct int_ { typedef int type; };

template <typename F, typename int_<decltype(F::check)>::type = 0>
static bool check(C *ptr, special_) {
if (!ptr->F::check()) {
return false;
}
return do_checks<C, Mx...>::check(ptr);
}
template <typename F>
static bool check(C *ptr, general_) {
return do_checks<C, Mx...>::check(ptr);
}
};

F 应该是 E。我不知道如何告诉编译器编译第一个“检查”是否 int_ 有类型,如果没有则编译第二个。

最佳答案

您可以创建一个名为 has_check 的特征,它为具有静态 check() 方法的类型返回 true。

namespace detail
{
template<class T, class = decltype(T::check())>
std::true_type has_check_impl(void*);

template<class T>
std::false_type has_check_impl(...);
}

template<class T>
struct has_check : decltype(detail::has_check_impl<T>(nullptr)) { };

然后您可以将它用作 std::enable_if 的谓词以启用/禁用重载(如果它具有以下方法):

private:
template<class T, class...>
using first = T;

template<class T = void,
class =
first<T,
typename std::enable_if<has_check<Mixins>::value, T>::type...>>
static void foo(void*)
{
auto x{ (0, Mixins::check(), 0)... };
(void)x;
}

static void foo(...)
{
auto x{ (0, Mixins::handle(), 0)... };
(void)x;
}

public:
static void check() {
foo(nullptr);
}

关于2 种功能类型的 C++ Mixins,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21945123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com