c++ - 如何使用 variadic size_t 模板将多个 std::tuple_element 分配为函数参数

标签 c++ c++11 variadic-templates

我想创建一个函数,通过一次调用更改元组内的多个值。

template<class... Args>
class EventN {
public:
  std::tuple<Args...> mArgs;

  EventN(Args... args) : mArgs(args) {}
  EventN() {}

  template<size_t N> void set(typename std::tuple_element<N-1,Tuple>::type value) {
     std::get<N-1>(mArgs) = value; //I use N-1, to start from '1'
  }

};

上面的 set 函数按照我的预期工作:

auto event = new EventN<String,int>();
event->set<1>("testEvent");
event->set<2>(12);

现在,我想将功能扩展到:

event->set<1,2>("testEvent", 12);

我怎样才能做到这一点?有没有办法制作std::tuple_element<N-1,Tuple>::type可变参数?

最佳答案

尝试这样的事情:

template <int ...N, typename ...Args>
void set_all(Args &&... args)
{
    int dummy[] = { (set<N>(std::forward<Args>(args)), 0)... };
    static_cast<void>(dummy);   // unused
}

这是有效的,因为不同的包是同步扩展的。这要求所有包都具有相同的大小,这是在编译时强制执行的。

虚拟数组和喜剧逗号运算符只是一种为了副作用而不关心它们的值而评估所有表达式的低级方法。

这是一个完整的小演示:

#include <iostream>
#include <utility>

template <int N, typename T> void set(T && t)
{
    std::cout << "Setting " << N << " => " << std::forward<T>(t) << "\n";
}

template <int ...N, typename ...Args>
void set_all(Args &&... args)
{
    int dummy[] = { (set<N>(std::forward<Args>(args)), 0)... };
    static_cast<void>(dummy);
}

int main()
{
    set_all<2, 51, 1>("Hello", 100, true);
}

观察到此时对整数的值没有限制;此约束仅在您使用整数作为元组索引时出现。

关于c++ - 如何使用 variadic size_t 模板将多个 std::tuple_element 分配为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20844519/

相关文章:

c++ - 从文件中的一行读取特定数据 - C++

c++ - 为什么我们在 C++ 中使用 std::function 而不是原来的 C 函数指针?

c++ - 为什么通过 const 引用传递 constexpr 对象有效,但按值不编译

c++ - 类型别名模板参数包

c++ - 其参数作为模板非类型传递的可变参数函数模板

c++ - 强制执行所有&&?

c++ - 迭代循环和 lambda 函数

c++ - 提高对 char 数组中指针语法的理解

c++11 - C++ range-for 和 boost::irange

c++ - 如何以标准方式组合 type_traits 中的条件