从类型而不是从变量获取指针级别
Get pointer level from type rather than from variable
我尝试将指针深度显示为星号的整数-例如int***
将是3
。但是我没有从类型中计算它,而是编写了要求必须正确初始化每一层指针的代码。下面是我的尝试:
#include <iostream>
#include <utility>
// no pointers involved
template <class T>
std::size_t get_pointer_level(T)
{
return 0;
}
// final value reached, returning depth
template <class T>
std::size_t get_pointer_level(std::pair<std::size_t, T> arg)
{
return arg.first;
}
// function that accummulates depth
template <class T>
auto get_pointer_level(std::pair<std::size_t, T*> arg)
{
return get_pointer_level(std::make_pair(arg.first+1, *arg.second));
}
// initial function called for pointer argument
template <class T>
auto get_pointer_level(T* arg)
{
return get_pointer_level(std::make_pair(std::size_t(1), *arg));
}
int main(void)
{
int a = 10;
auto b = &a; //int*
auto c = &b; //int**
auto d = &c; //int***
auto e = &d; //int****
std::cout << get_pointer_level(e) << std::endl; //4
}
我很确定仅仅使用type是很有可能的。我想语法应该是这样的:
get_pointer_level<int****>::value
任何想法?
编辑:
谢谢你的解决方案!下面是我想要完成的最后一个功能:
template <std::size_t A, std::size_t B>
struct is_smaller
{
enum {value = (A < B)? 1 : 0};
};
template<std::size_t Target, typename T, std::size_t Actual = get_pointer_level<T>::value>
T value_at_level(T pointer)
{
static_assert(Actual==Target, "Invalid target level!");
return pointer;
}
template<std::size_t Target, typename T, std::size_t Actual = get_pointer_level<T*>::value,
typename = std::enable_if<is_smaller<Target, Actual>::value>::type>
auto value_at_level(T* pointer)
{
return value_at_level<Target>(*pointer);
}
int main()
{
int a = 5;
auto b = &a; //int*
auto c = &b; //int**
auto d = &c; //int***
auto e = &d; //int****
std::cout << "int from int****: " << value_at_level<0>(e) << std::endl; //ok
std::cout << "int* from int***: " << value_at_level<1>(d) << std::endl; //ok
std::cout << "int** from int**: " << value_at_level<2>(c) << std::endl; //ok
std::cout << "int*** from int*: " << value_at_level<3>(b) << std::endl; //error
std::cout << "int**** from int: " << value_at_level<5>(a) << std::endl; //error
}
部分专门化的练习:
#include <cstddef>
template<typename T, std::size_t S>
struct get_pointer_level_impl
{
static const std::size_t value = S;
};
template<typename T, std::size_t S>
struct get_pointer_level_impl<T*, S> : get_pointer_level_impl<T, S+1>
{
};
template<typename T>
struct get_pointer_level : get_pointer_level_impl<T, 0>
{
};
#include <iostream>
int main()
{
std::cout << get_pointer_level<int>::value << "n";
std::cout << get_pointer_level<int*>::value << "n";
std::cout << get_pointer_level<int**>::value << "n";
std::cout << get_pointer_level<int***>::value << "n";
}
输出:0
1
2
3
如果您可以将其称为get_pointer_level<int*>()
而不是get_pointer_level<int*>::value
,那么递归constexpr
函数就可以正常工作:
#include <iostream>
#include <type_traits>
template <typename T>
constexpr int get_pointer_level()
{
return !std::is_pointer<T>::value ? 0 : 1 + get_pointer_level<typename std::remove_pointer<T>::type>();
}
int main() {
std::cout << get_pointer_level<int>() << 'n';
std::cout << get_pointer_level<int*>() << 'n';
std::cout << get_pointer_level<int**>() << 'n';
std::cout << get_pointer_level<int***>() << 'n';
std::cout << get_pointer_level<int****>() << 'n';
}
现场演示
使用辅助类来确定指针的级别。
#include <iostream>
template <class T> struct PointerLevel
{
static const std::size_t value = 0;
};
template <class T> struct PointerLevel<T*>
{
static const std::size_t value = PointerLevel<T>::value + 1;
};
// no pointers involved
template <class T>
std::size_t get_pointer_level(T)
{
return PointerLevel<T>::value;
}
int main(void)
{
int a = 10;
auto b = &a; //int*
auto c = &b; //int**
auto d = &c; //int***
auto e = &d; //int****
std::cout << get_pointer_level(a) << std::endl;
std::cout << get_pointer_level(b) << std::endl;
std::cout << get_pointer_level(c) << std::endl;
std::cout << get_pointer_level(d) << std::endl;
std::cout << get_pointer_level(e) << std::endl; //4
}
输出:0
1
2
3
4
你觉得使用typeid(你的类型).name()怎么样?
std::string s( typeid(int***).name());
size_t n = std::count(s.begin(), s.end(), "*");
相关文章:
- 我可以使用 decltype() 或其他东西通过指针获取真实类型吗?
- 通过基类指针获取派生类对象的引用
- C++从双指针获取数据
- 如何从原始指针获取shared_ptr?
- 如何从C++中的字符指针获取子字符串
- 使用 std::launder 从指向非活动工会成员的指针获取指向活动工会成员的指针?
- 使用我的共享指针获取内存泄漏
- 通过指向非多态类型的基类的指针获取已分配内存的地址
- 指向引用的指针获取器
- 使用 std::launder 从指向非活动对象的指针获取指向活动对象成员的指针?
- CPP:无法使用 -> 通过指针获取成员的值
- 字符串十六进制到指针获取值
- 从基类指针获取模板派生类的值
- 从 C++ 数组元素的指针获取索引的最快方法是什么
- 通过指针获取最大数量的元素
- 如何使用指针获取字符串数据
- 返回指向指针数组的指针获取下一个元素失败
- 从"子项"项指针获取"父""std::tuple"
- 从成员函数指针获取方法的返回类型
- 如何从指向数组的指针获取对该数组的引用