【发布时间】:2016-09-01 19:28:27
【问题描述】:
我尝试将指针深度显示为整数个星号 - 例如 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
}
我很确定它很可能仅与类型一起工作。我想语法会是这样的:
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
}
【问题讨论】:
-
好奇:建议的用例是什么?
-
这似乎是一个微不足道的 TMP;为什么这么复杂?
-
我想要实现的是能够在给定级别取消引用指针。需要所需的整数值来检查需要取消引用的次数。示例:我想从
int*****值中获取int*值。整数将是1和5,因此所需的取消引用量将是4次。