从模板参数包 C++ 中解压第一个参数

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..。可以包含不同的类型(字符串、布尔值等)

Jar*_*d42 5

在你的情况下更简单似乎将你的功能更改为:

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)


康桓瑋*_*康桓瑋 5

您可以使用 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)