用于获取多个容器参考的variadic模板
Variadic template for taking multiple containers references
我想具有一个函数,以多个引用对容器并返回所有元素的组合。由于此操作是在极其热的循环中执行的,因此我希望能够在静态上尽可能多地抛弃操作,而无需编写5个基本相同功能的实例。
我正在执行的算法以
的方式行为const auto result = s0 + a1 * s1 + a2 * s2 + ...
所有si
都是包含所有相同数量元素的容器。汇编时已知要概括的元素数量。
我正在寻找的功能应表现为:(假设)
inline Container sum(const Container& s0, double a1, const Container& s2, ....){
auto result = Container(s0);
for (int i = 0; i < result.size(); ++i)
result[i] += a1 * s1[i] + a2 * s2[i] + ...;
return result;
}
出于绩效原因,不希望用运行时界检查编写一些内部循环。同样,当尝试使用运行时界限时,我遇到的问题是,如果在这种情况下,我只能诉诸指针。
所有代码都需要有效C 11,我无法访问此项目中更现代的编译器。
i会将double
和container
分组为:
template <typename C, typename ... Cs>
C sum(const C& c0, const Cs&... cs)
{
auto result = c0;
for (int i = 0; i < result.size(); ++i)
#if 0 // C++17
result[i] += (cs[i] + ...);
#else // C++11/C++14
const int dummy[] = {0, (static_cast<void>(result[i] += cs[i]), 0)...};
static_cast<void>(dummy); // avoid warning for unused variable.
#endif
return result;
}
因此,对于分组,类似:
template <typename C>
struct MulContainer
{
auto operator [](int i) const { return d * c[i]; }
double d;
const C& c;
};
所以打电话而不是
sum(c0, a1, c1, a2, c2);
您将有:
sum(c0, MulContainer{a1, c1}, MulContainer{a2, c2});
如果真的需要,则使用std::index_sequence
,您可能仍然有第一个调用语法。
template <typename C, std::size_t... Is, typename Tuple>
C sum_impl(const C& c0, std::index_sequence<Is...>, const Tuple& t)
{
return sum(c0, MulContainer{std::get<2 * Is>(t), std::get<2 * Is + 1>(t)}...);
}
template <typename C, typename ... Ts>
C final_sum(const C& c0, const Ts&... ts)
{
static_assert(sizeof...(Ts) % 2 == 0);
return sum_impl(c0, std::make_index_sequence<sizeof...(Ts) / 2>{}, std::tie(ts...));
}
std::index_sequence
是C 14,但可以在C 11中实现。
相关文章:
- C++错误消息*成员参考.**初学者*
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 参考资源文件VC++中的$(SolutionDir)
- Variadic模板未编译
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- variadic模板中的模板参数推导失败
- 为什么在运算符重载时需要参考?
- 使 \page 和 \subpage 参考 doxygen 中的方法文档
- [temp.variadic]中关于包扩展实例化的措辞
- std::shared_ptr 自定义参考计数器
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- 避免在基于反向范围的for循环实现中悬挂参考
- 通用参考 l 值不复制对象
- 标准::enable_if和通用参考的使用差异
- 标准::积累参考?
- C++丢失了参考
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 传递对variadic-templates的引用使用std ::参考 - wrapper
- 用于获取多个容器参考的variadic模板
- variadic模板阵列参考参数的语法是什么?