为非变异算法定义constexpr值集的最佳方法

时间:2018-06-23 21:15:23

标签: c++ templates boost constexpr

我想使用<algorithm>中的非变异算法,并对编译时已知的一组值提高范围算法。我想知道哪种方法最有效(就性能和内存而言),不包括切换案例方法。

让我们考虑带有一些值的enum(是否为class)。

enum Enum
{
   One,
   Two,
   Three
};

让我们考虑平凡函数bool isOneOrTwo(Enum e)。 我知道使用<algorithm>方法可以用两种方法来编写: 1. std::initializer_list<T>

bool isOneOrTwo(Enum e)
{
    constexpr std::initializer<Enum> oneAndTwo{One, Two};
    return std::any_of(std::begin(oneAndTwo),
                       std::end(oneAndTwo),
                       [e](auto i){return e == i;});
}

2。 std::array<T,N>

我们有make_pairmake_tuple,但不幸的是我们没有make_array<T>(T&&..)函数,所以我写了一个:

template<typename... T>
constexpr auto make_array(T&&... args)
{
    return std::array<typename std::common_type<T...>::type, sizeof...(T)>{{std::forward<T>(args)...}};
}

然后可以通过以下方式进行功能:

bool isOneOrTwo(Enum e)
{
    constexpr auto oneAndTwo = make_array(One, Two);
    return std::any_of(std::begin(oneAndTwo),
                       std::end(oneAndTwo),
                       [e](auto i){return e == i;});
}

哪个更好(std::initializer_list<T>std::array<T,N>),或者还有其他方法可以使它更快/更便宜?

如果我将std::any_of(begin_it, end_it, lambda)更改为boost::algorithm::any_of_equal(make_iterator_range(begin_it, end_it), value)会产生什么影响吗?

0 个答案:

没有答案