c++ - 当构造函数具有相同的参数类型(文件路径)时,如何从数组创建(初始化)std::tuple

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

我有一些类都有一个采用文件路径的构造函数。我想从主函数中的 argv 参数创建一个 std::tuple 。这是草图

class A { 
  public:
  A(const char *); // Taking a file path
};

class B {
  public:
  B(const char *); // Taking a file path
};

int main(int argc, char* argv[]) {
  auto tup(myCreateTuple<A, B, A>(argc, argv)); 
  // myCreateTuple would in this case use argv[1], argv[2]
  // and argv[3] to create A(argv[1]), B(argv[2]) and A(argv[3]). 
  // argc is just passed along to verify that argv is long enough.
  // tup would have of the type std::tuple<A ,B, A>
}

创建元组成员的顺序并不重要(即构造函数的执行顺序允许未定义)。您知道如何实现 myCreateTuple 吗?

我想可以完全避免 myCreateTuple 并使用

std::tuple<A, B, A> tup{ A(argv[1]), B(argv[2]), A(argv[3]) };

但这将是一个不太通用的解决方案。

最佳答案

使用 <redi/index_tuple.h> 提供一个编译时整数序列,在包扩展中生成数组索引:

#include <tuple>
#include <assert.h>
#include <redi/index_tuple.h>

template<typename... T, unsigned... I>
inline std::tuple<T...>
myCreateTuple_impl(char** argv, redi::index_tuple<I...>)
{
  return std::tuple<T...>(argv[I+1]...);
}

template<typename... T>
inline std::tuple<T...>
myCreateTuple(int argc, char** argv)
{
  assert(argc > sizeof...(T));
  return myCreateTuple_impl<T...>(argv, redi::to_index_tuple<T...>());
}

关于c++ - 当构造函数具有相同的参数类型(文件路径)时,如何从数组创建(初始化)std::tuple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14089993/

相关文章:

c++ - Strncpy 只能与固定长度数组一起使用

c++ - 使用模板元编程 [C++11] 对整数列表进行操作

c++ - 如何找出编译器生成了哪些函数?

python - list、tuple、dict底层数据结构

arrays - 在其类型签名中指定数组的长度

javascript - 我可以在 iPhone 上运行 javascript 运行时(如 v8)吗?

c++ - 是否需要定义 "=="运算符才能使用 std::find

c++ - 重置未定义行为后是否使用 shared_ptr?

c++ - 使用 shared_ptr : C++ 管理多个对象

c# - 在 C# 中查找和删除元组列表中的重复项