pal*_*apa 6 c++ templates constexpr constexpr-function
有没有办法编写一个 constexpr 函数来返回 std::vector 的嵌套深度?
例子:
get_vector_nested_layer_count<std::vector<std::vector<int>>>() // 2
get_vector_nested_layer_count<std::vector<std::vector<std::vector<float>>>>() // 3
Run Code Online (Sandbox Code Playgroud)
康桓瑋*_*康桓瑋 11
最简单的方法是使用递归
#include <vector>
template<class T>
constexpr bool is_stl_vector = false;
template<class T, class Alloc>
constexpr bool is_stl_vector<std::vector<T, Alloc>> = true;
template<class T>
constexpr std::size_t get_vector_nested_layer_count() {
if constexpr (is_stl_vector<T>)
return 1 + get_vector_nested_layer_count<typename T::value_type>();
else
return 0;
};
Run Code Online (Sandbox Code Playgroud)
C++17 之前(如果是 constexpr 之前),您可以使用特征和专业化来实现底层逻辑
#include <cstddef>
#include <vector>
template <typename> struct vector_nested_layer_count {
static constexpr std::size_t value{0};
};
template <typename T> struct vector_nested_layer_count<std::vector<T>> {
static constexpr std::size_t value{1 + vector_nested_layer_count<T>::value};
};
Run Code Online (Sandbox Code Playgroud)
或者,使用std::integral_constant:
#include <cstddef>
#include <type_traits>
#include <vector>
template <typename>
struct vector_nested_layer_count : std::integral_constant<std::size_t, 0> {};
template <typename T>
struct vector_nested_layer_count<std::vector<T>>
: std::integral_constant<std::size_t,
1 + vector_nested_layer_count<T>::value> {};
Run Code Online (Sandbox Code Playgroud)
应用这些方法之一并添加辅助变量模板:
template <typename T>
constexpr std::size_t vector_nested_layer_count_v{
vector_nested_layer_count<T>::value};
static_assert(vector_nested_layer_count_v<int> == 0);
static_assert(vector_nested_layer_count_v<std::vector<std::vector<int>>> == 2);
static_assert(
vector_nested_layer_count_v<std::vector<std::vector<std::vector<float>>>> ==
3);
Run Code Online (Sandbox Code Playgroud)
_v如果您对惯用的辅助变量模板(而不是函数)不满意,您可以将函数实现为:
template <typename T> constexpr int get_vector_nested_layer_count() {
return vector_nested_layer_count_v<T>;
}
static_assert(get_vector_nested_layer_count<std::vector<std::vector<int>>>() ==
2);
static_assert(get_vector_nested_layer_count<
std::vector<std::vector<std::vector<float>>>>() == 3);
Run Code Online (Sandbox Code Playgroud)
如果您使用 C++17 或超出 constexpr,如果其他答案的方法可以说更简洁,如果您确实想要这种查询特征的函数 API(在经典元编程中有些非典型)。