gpt4 book ai didi

c++ - 通过 std::tuple<...> 实现 map() 和 each() - 将索引作为模板参数传递给仿函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:29 24 4
gpt4 key购买 nike

经过几年的 Web 开发,我再次使用 C++ (14) 工作,并决定通过模板元编程获得一些“动态类型函数的乐趣”。

我已经实现了mapeach在元组上:

template <typename Tuple, typename Func, size_t... index>
void tuple_each_internal(Tuple const & tuple, Func func, index_sequence<index...>)
{
auto res = {
(func(get<index>(tuple)), nullptr)...
};
}

template <typename Tuple, typename Func, typename Indices = make_index_sequence<tuple_size<Tuple>::value>>
void tuple_each(Tuple const & tuple, Func func)
{
tuple_each_internal(tuple, func, Indices());
}

struct demo_functor_each {

/* Case #1: "Each" callback */
template <typename T>
void operator ()(T&& t) { ; }

/* Case #2: "Each with index as run-time parameter" callback */
//template <typename T>
//void operator ()(const size_t index, T&& t) { ; }

/* Case #3: "Each with index as compile-time parameter" callback */
//template <typename T, size_t index>
//void operator ()(T&& t) { ; }

};

void Example_Usage()
{
tuple<int, bool, string> t;
tuple_each(t, demo_functor_each());
}

map 的类似实现.

  • 案例 #1 通过语法检查(我还没有尝试运行它)。

  • 案例 #2 也通过了语法检查,结果为 tuple_each_internal修改为将索引作为函数参数传递:func(index, get<index>(tuple)) .

  • 案例 #3 优于案例 #2,因为 index 的值可以在编译时传递给其他模板(例如 get<index>(tuple) ),这在情况 #2 中是不可能的。

我无法实现案例 #3。

给定回调签名:

template <typename T, size_t index>
void operator ()(T&& t) { ; }

我试过这个作为 tuple_each_internal :

auto res = {
(func<typename tuple_element<index, Tuple>::type, index>(get<index>(tuple)), nullptr)...
};

Clang++ 3.6.1 输出:

$ clang++ -std=c++14 tuple_iteration.h

error: expected '(' for function-style cast or type construction

auto res = { (func<typename tuple_element<index, Tuple>::type, index>(get<index>(tuple)), nullptr)... };
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

g++ 5.1.0 输出:

$ g++ -std=c++14 tuple_iteration.h

error: expected ‘(’ before ‘,’ token

auto res = { (func<typename tuple_element<index, Tuple>::type, index>(get<index>(tuple)), nullptr)... };
^

最佳答案

应该是:

auto res = {
(func.template operator()<const typename tuple_element<index, Tuple>::type&, index>(get<index>(tuple)),
nullptr)...
};

Live Demo .

更简单

/* Case #4: "Each with index as compile-time parameter" callback */
template <size_t index, typename T>
void operator ()(T&& t);

代码变为:

auto res = {
(func.template operator()<index>(get<index>(tuple)),
nullptr)...
};

Live Demo

甚至

template <size_t N, typename T>
void operator ()(std::integral_constant<std::size_t, N>, T&& t);

结果

auto res = {
(func(std::integral_constant<std::size_t, index>{}, get<index>(tuple)),
nullptr)...
};

Live Demo

关于c++ - 通过 std::tuple<...> 实现 map() 和 each() - 将索引作为模板参数传递给仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31340076/

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