我有一些类都有一个采用文件路径的构造函数。我想从主函数中的 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/