如何传递名称以方便使用元组?
How to pass a name for convenient use of tuple?
我想改进代码以便与它交互。
struct prototype {
template <class... T1>
prototype(T1&&... args) {
auto p = std::tie(args...);
std::cout << std::get<0>(p) << std::endl;
if constexpr(std::tuple_size_v<decltype(p)> >= 3) {
std::cout << std::get<2>(p) << std::endl;
}
}
};
int option_1 = 10;
std::string option_2 = "test2";
auto option_3 = 0.41;
std::vector<int> option_4(10);
int main() {
prototype p1(option_1, option_2, option_3, option_4);
prototype p2(option_1, option_2, option_3);
prototype p3(option_1, option_2);
prototype p4(option_1);
}
我愿意
std::cout << option_1 << std::endl;
if constexpr (std::tuple_size_v<decltype(p)> >= 3) {
std::cout << option_2 << std::endl;
}
我不喜欢这个选项std::get<0>(p)
关于如何替换对元组的调用有什么想法吗?
上看到该选项
您可以使用 lambda 创建变量模板。在一天结束的时候,你想要的只是一个编译时间常量传递给 std::get
:
template <std::size_t N>
constexpr auto option = [] (auto p) -> auto&& { return std::get<N-1>(p); };
这个可以用作option<1>(p)
熟悉的 lambda 模板语法似乎是另一种选择:
constexpr auto option = []<std::size_t N>(auto p) { return std::get<N-1>(p); };
此处 std::get
的参数作为非类型模板参数传递。正如 @Davis Herring
提到的,不幸的是,这并不意味着 lambda 将被用作 option<1>(p)
。原因是 lambda 本身不是模板,它的函数调用运算符是。 proposal 对 lambda 本身的模板性没有任何改变。结果,上面的 lambda 可调用为
option.operator()<1>(p)
我想改进代码以便与它交互。
struct prototype {
template <class... T1>
prototype(T1&&... args) {
auto p = std::tie(args...);
std::cout << std::get<0>(p) << std::endl;
if constexpr(std::tuple_size_v<decltype(p)> >= 3) {
std::cout << std::get<2>(p) << std::endl;
}
}
};
int option_1 = 10;
std::string option_2 = "test2";
auto option_3 = 0.41;
std::vector<int> option_4(10);
int main() {
prototype p1(option_1, option_2, option_3, option_4);
prototype p2(option_1, option_2, option_3);
prototype p3(option_1, option_2);
prototype p4(option_1);
}
我愿意
std::cout << option_1 << std::endl;
if constexpr (std::tuple_size_v<decltype(p)> >= 3) {
std::cout << option_2 << std::endl;
}
我不喜欢这个选项std::get<0>(p)
关于如何替换对元组的调用有什么想法吗?
上看到该选项您可以使用 lambda 创建变量模板。在一天结束的时候,你想要的只是一个编译时间常量传递给 std::get
:
template <std::size_t N>
constexpr auto option = [] (auto p) -> auto&& { return std::get<N-1>(p); };
这个可以用作option<1>(p)
熟悉的 lambda 模板语法似乎是另一种选择:
constexpr auto option = []<std::size_t N>(auto p) { return std::get<N-1>(p); };
此处 std::get
的参数作为非类型模板参数传递。正如 @Davis Herring
提到的,不幸的是,这并不意味着 lambda 将被用作 option<1>(p)
。原因是 lambda 本身不是模板,它的函数调用运算符是。 proposal 对 lambda 本身的模板性没有任何改变。结果,上面的 lambda 可调用为
option.operator()<1>(p)