如何确保可变元组中的类型相同?
How do I make sure Types in a variadic Tuple are identical?
我想为具有可变数量的特定类型(现在是算术类型)的元组创建一个 toString 函数。
像这样
<template T, typename enable_if<is_arithmetic_v<T>>::type* = nullptr>
toString(tuple<T...> tup)
{
std::stringstream ss;
std::apply([&ss](auto&&... args) {((ss << args << ";"), ...); }, tup);
return ss.str();
}
其中所有成员都是同一类型,并且类型是数字类型。
我找到了 ,但它允许所有类型和混合元组,例如 make_tuple("str", 12.0f, 123)
。
有人可以解释一下我如何在 C++17 中做到这一点吗?
谢谢:)
您可以借助 fold expression (C++17 起)检查所有类型是否相同。
例如
template <typename T, // the 1st type
typename... Args, // subsequent types
typename enable_if<is_arithmetic_v<T>>::type* = nullptr, // check for arithmetic type
typename enable_if<(is_same_v<T, Args> && ...)>::type* = nullptr> // check all the types are identical or not
auto toString(tuple<T, Args...> tup)
{
std::stringstream ss;
std::apply([&ss](auto&&... args) {((ss << args << ";"), ...); }, tup);
return ss.str();
}
我想为具有可变数量的特定类型(现在是算术类型)的元组创建一个 toString 函数。
像这样
<template T, typename enable_if<is_arithmetic_v<T>>::type* = nullptr>
toString(tuple<T...> tup)
{
std::stringstream ss;
std::apply([&ss](auto&&... args) {((ss << args << ";"), ...); }, tup);
return ss.str();
}
其中所有成员都是同一类型,并且类型是数字类型。
我找到了 make_tuple("str", 12.0f, 123)
。
有人可以解释一下我如何在 C++17 中做到这一点吗?
谢谢:)
您可以借助 fold expression (C++17 起)检查所有类型是否相同。
例如
template <typename T, // the 1st type
typename... Args, // subsequent types
typename enable_if<is_arithmetic_v<T>>::type* = nullptr, // check for arithmetic type
typename enable_if<(is_same_v<T, Args> && ...)>::type* = nullptr> // check all the types are identical or not
auto toString(tuple<T, Args...> tup)
{
std::stringstream ss;
std::apply([&ss](auto&&... args) {((ss << args << ";"), ...); }, tup);
return ss.str();
}