【发布时间】:2012-12-11 14:42:11
【问题描述】:
我有一个
typedef std::tuple<A, B> TupleType;
并且想使用类列表 对于“模板”。
假设我有:
template<typename... args>
std::tuple<args...> parse(std::istream &stream) {
return std::make_tuple(args(stream)...);
}
并且我可以成功地使用它:
auto my_tuple = parse<A, B>(ifs);
如果我已经有一个,是否可以避免指定类列表 A,B
typedef std::tuple<A,B> TupleType;
列表 A,B 已经在哪里了?
一个例子:
#include <cstdlib> // EXIT_SUCCESS, EXIT_FAILURE
#include <iostream> // std::cerr
#include <fstream> // std::ifstream
#include <tuple> // std::tuple
class A {
public:
A(std::istream &); // May throw FooBaarException
};
class B {
public:
B(std::istream &); // May throw FooBaarException
};
template<typename... args>
std::tuple<args...> parse(std::istream &stream) {
return std::make_tuple(args(stream)...);
}
int main() {
std::ifstream ifs;
ifs.exceptions(ifstream::eofbit | ifstream::failbit | ifstream::badbit);
int res = EXIT_FAILURE;
try {
ifs.open("/some/file/path", std::ios::in | std::ios::binary);
auto my_tuple = parse<A, B>(ifs); // my_tuple is of the type std::tuple<A,B>
/* Here do something interesting with my_tuple */
res = EXIT_SUCCESS;
} catch (ifstream::failure e) {
std::cerr << "error: opening or reading file failed\n";
} catch (FooBaarException e) {
std::cerr << "error: parsing in a constructor failed\n";
}
return res;
}
【问题讨论】:
-
看来在构造函数中你想从字符串中读取。请注意,对于
parse的实现,未指定构造函数的调用顺序。 -
@JohannesSchaub-litb,有趣的一点。也可以这样做:liveworkspace.org/code/MTk2Nj$0,前提是组件类型是不同的(可能但太长,无法作为重复类型的示例显示)。
-
7 年后...考虑 std::apply 自 C++17 以来。
标签: c++ c++11 tuples variadic-templates