Ida*_*hen 2 c++ templates parameter-pack
我对模板很陌生,特别是参数包,我想知道是否可以从包中获取第一个值。
例如下面的代码:
template <typename T, typename... Args>
bool register(Args... args) {
if (!Foo<T>(args..) {
assert(std::is_same_v<std::string, args...[0]>);
std::cerr << "Failed call Foo with " + args...[0] + "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
我如何真正获得第一个值args...?
值得注意的是args..。可以包含不同的类型(字符串、布尔值等)
在你的情况下更简单似乎将你的功能更改为:
template <typename T, typename Arg, typename... Args>
bool register(Arg arg, Args... args) {
if (!Foo<T>(arg, args...) {
assert(std::is_same_v<std::string, Arg>);
std::cerr << "Failed call Foo with " + arg + "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
从断言来看,甚至
template <typename T, typename... Args>
bool register(const std::string& s, Args... args) {
if (!Foo<T>(s, args...) {
std::cerr << "Failed call Foo with " + s + "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
else<tuple>提供了一些有用的工具:
template <typename T, typename... Args>
bool register(Args... args) {
if (!Foo<T>(args...) {
assert(std::is_same_v<std::string,
std::tuple_element_t<0, std::tuple<Args...>>);
std::cerr << "Failed call Foo with "
+ std::get<0>(std::tie(args...)) + "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用 lambda 来提取第一个参数:
template<typename T, typename... Args>
bool register(Args... args) {
if (!Foo<T>(args...)) {
auto& first = [](auto& first, auto&...) -> auto& { return first; }(args...);
static_assert(std::is_same_v<std::string,
std::remove_reference_t<decltype(first)>>);
std::cerr << "Failed call Foo with " + first + "\n";
}
}
Run Code Online (Sandbox Code Playgroud)