2

我有一些类都有一个带有文件路径的构造函数。我想从主函数中的 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]) };

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

4

2 回答 2

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...>());
}
于 2012-12-30T12:07:49.883 回答
1

根据您传入的类型数创建值 1 2 3(或 0 1 2)的整数的编译时间序列。

然后将序列作为索引引用到数组中,并使用 ... 语法将 setter 引用到元组中。或者将 ... 直接放入构造函数调用中,并使用取消引用数组的 int 序列。

于 2012-12-30T11:47:00.350 回答