如何将 std::array 传递给可以接受 std::vector 的函数模板
How to pass a std::array to a function template which can accept std::vector
我正在尝试编写一个模板,它可以接受一些序列容器:
template <typename S,
typename = std::enable_if_t<
std::is_same<S, std::array<typename S::value_type>, S::size()>::value ||
std::is_same<S, std::vector<typename S::value_type>>::value>>
std::string arr2String(const S& seqContainer) {
std::stringstream res;
for (const auto& element : seqContainer) {
res << element << "|";
}
return res.str();
}
但是,由于S::size()
,无法编译。显然,没有这回事。
是否可以制作这样一个模板函数,可以处理std::vector
和std::array
?
如果你想限制你的模板只适用于 std::array
或 std::vector
,你可以写一些辅助特征
template <typename>
struct is_array : std::false_type {}
template <typename T, std::size_t N>
struct is_array<std::array<T, N>> : std::true_type {}
template <typename>
struct is_vector : std::false_type {}
template <typename... Ts>
struct is_vector<std::vector<Ts...>> : std::true_type {}
template <typename S,
typename = std::enable_if_t<
is_array<S>::value ||
is_vector<S>::value>>
std::string arr2String(const S& seqContainer) {
std::stringstream res;
for (const auto& element : seqContainer) {
res << element << "|";
}
return res.str();
}
否则你可以在 SFINAE 上做一些更一般的事情
template <typename S, typename = typename S::value_type>
std::string arr2String(const S& seqContainer) {
std::stringstream res;
for (const auto& element : seqContainer) {
res << element << "|";
}
return res.str();
}
如果您实例化一个数组并获取其大小,即 constexpr,您的代码实际上可以被编译。
template <typename S,
typename = std::enable_if_t<
std::is_same<S, std::array<typename S::value_type, S{}.size()>>::value ||
std::is_same<S, std::vector<typename S::value_type>>::value>>
std::string arr2String(const S& seqContainer) {
std::stringstream res;
for (const auto& element : seqContainer) {
res << element << "|";
}
return res.str();
}
如果您的值类型的默认初始化开销很大,这当然会有问题。
我正在尝试编写一个模板,它可以接受一些序列容器:
template <typename S,
typename = std::enable_if_t<
std::is_same<S, std::array<typename S::value_type>, S::size()>::value ||
std::is_same<S, std::vector<typename S::value_type>>::value>>
std::string arr2String(const S& seqContainer) {
std::stringstream res;
for (const auto& element : seqContainer) {
res << element << "|";
}
return res.str();
}
但是,由于S::size()
,无法编译。显然,没有这回事。
是否可以制作这样一个模板函数,可以处理std::vector
和std::array
?
如果你想限制你的模板只适用于 std::array
或 std::vector
,你可以写一些辅助特征
template <typename>
struct is_array : std::false_type {}
template <typename T, std::size_t N>
struct is_array<std::array<T, N>> : std::true_type {}
template <typename>
struct is_vector : std::false_type {}
template <typename... Ts>
struct is_vector<std::vector<Ts...>> : std::true_type {}
template <typename S,
typename = std::enable_if_t<
is_array<S>::value ||
is_vector<S>::value>>
std::string arr2String(const S& seqContainer) {
std::stringstream res;
for (const auto& element : seqContainer) {
res << element << "|";
}
return res.str();
}
否则你可以在 SFINAE 上做一些更一般的事情
template <typename S, typename = typename S::value_type>
std::string arr2String(const S& seqContainer) {
std::stringstream res;
for (const auto& element : seqContainer) {
res << element << "|";
}
return res.str();
}
如果您实例化一个数组并获取其大小,即 constexpr,您的代码实际上可以被编译。
template <typename S,
typename = std::enable_if_t<
std::is_same<S, std::array<typename S::value_type, S{}.size()>>::value ||
std::is_same<S, std::vector<typename S::value_type>>::value>>
std::string arr2String(const S& seqContainer) {
std::stringstream res;
for (const auto& element : seqContainer) {
res << element << "|";
}
return res.str();
}
如果您的值类型的默认初始化开销很大,这当然会有问题。