gpt4 book ai didi

c++ - 将 boost::mpl::find_if 与自定义谓词一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:03 25 4
gpt4 key购买 nike

给定

struct A {};
struct B {};
struct C {C(B) {}};
struct D : B {};
struct E {operator A() const {return A();}};
struct F {};

using AllowedTypes = boost::mpl::vector<A, C>;

我正在尝试实现一个谓词 is_allowed_type 以便

static_assert(is_allowed_type<A>::value, "A is in AllowedTypes");
static_assert(is_allowed_type<B>::value, "C is constructible from B");
static_assert(is_allowed_type<C>::value, "C is in AllowedTypes");
static_assert(is_allowed_type<D>::value, "D inherits from B, from which C is constructible");
static_assert(is_allowed_type<E>::value, "E is convertible to A");
static_assert(!is_allowed_type<F>::value, "F is not convertible to A nor C");

谓词必须返回真,前提是它的参数可以转换为 AllowedTypes 中的一种类型。

这是我想出的。

template <typename T>
struct is_allowed_type
{
using I = boost::mpl::find_if<AllowedTypes, std::is_convertible<T, boost::mpl::_>>;
using End = boost::mpl::end<AllowedTypes>;
enum {value = !std::is_same<I, End>::value};
};

最后一个断言失败。我的 is_allowed_type 有什么问题?

最佳答案

我在写问题时找到了答案,但由于我很难找到关于该主题的 Material ,所以我将其发布。

is_allowed_type 中的迭代器定义缺少 ::type。正确的实现是

template <typename T>
struct is_allowed_type
{
using I = typename boost::mpl::find_if<AllowedTypes, std::is_convertible<T, boost::mpl::_>>::type;
using End = typename boost::mpl::end<AllowedTypes>::type;
enum {value = !std::is_same<I, End>::value};
};

关于c++ - 将 boost::mpl::find_if 与自定义谓词一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44721895/

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