用于存储不同级别指针的泛型变量
Generic variable to store varying levels of pointers
我想为指针类型的对象编写一个通用的集中式null-checker API。我想要填充我的输入指针对象的列表,并调用null-checker API来扫描该列表并验证是否有任何指针对象具有null值。为此,我需要在一个通用变量中存储不同级别的指针。我如何在C++中做到这一点?
template<typename type>
bool check(type& t)
{
return false;
}
template<typename type>
bool check(type* t)
{
return true;
}
int main()
{
char** doubleCharPointer = NULL;
char* charPointer = "charPointer";
doubleCharPointer = &charPointer;
char** temp = doubleCharPointer;
char* temp1 = NULL;
int count = 0;
if(!check(temp))
{
cout << "nNot a pointer" << endl;
return 0;
}
temp1 = *temp;
count++;
if(!check(temp1))
{
cout << "nPointer level : " << count << endl;
return 0;
}
count++;
cout << "nPointer level : " << count << endl;
}
这是我的空检查器原型。它现在非常静止。但是我想扩展它以支持任何级别的指针检查。为此,我需要"temp"能够容纳任何级别的指针,这样我就可以运行无限while循环,直到输入指针的所有级别都被消耗和验证为止。我该怎么做?请帮忙。
如果不知道级别的确切数量,我不相信有直接的解决方案。假设您可以逐层检查每个级别是否为NULL,但主要问题是您不知道必须搜索多远,所以最终如果您只是从一个地址转到另一个地址,您可能会发现一个NULL指针,或者因为没有停止条件而永远无法结束验证循环。通过这样做,您还可以访问一个未分配的内存地址,该地址可能会引发异常,也可能不会引发异常,因此您不能将此引发的异常用作停止条件。
我想你想要
template<typename T>
bool check_ptr_not_null(const T&)
{
return true; // not a pointer
}
template<typename T>
bool check_ptr_not_null(T* t)
{
return (t != nullptr) && check_ptr_not_null(*t);
}
实时演示
免责声明:不要投票这个答案(肮脏的黑客)
根据A-B的回答,这是我目前能得到的最好的答案:
template<typename T>
bool notnull(T const *t, int level) {
while (level-- > 1) {
if (t == NULL)
return false;
t = (T const *)*t;
}
return t != NULL;
}
注意,由于行t = (T const *)*t
,这将导致一些编译器警告,所以我认为这是不安全的。一个更干净的方法是定义一些宏:
#define NOTNULL_P1(x) (x != NULL)
#define NOTNULL_P2(x) ((x != NULL) && NOTNULL_P1(*x))
#define NOTNULL_P3(x) ((x != NULL) && NOTNULL_P2(*x))
#define NOTNULL_P4(x) ((x != NULL) && NOTNULL_P3(*x))
#define NOTNULL_P5(x) ((x != NULL) && NOTNULL_P4(*x))
相关文章:
- 是否可以在C++中创建泛型函数指针?
- 对列表类中的泛型方法禁用编译器警告 2100,该泛型方法可能包含指针,也可能不包含指针
- 泛型方法指针.reinterpret_cast指向不同类的方法指针,这是 UB 吗?
- 仅当泛型类型的值是指针时,才删除该值
- Boost:当缺少类型时,如何通过基指针序列化/反序列化泛型类型集合
- 指向类成员函数的泛型函数指针
- 返回泛型函数中对象的引用(具有指针或非指针属性)
- 将类型作为指向另一个类的对象的指针的泛型类-NOT WORKING
- 使用基类的泛型方法指针调用派生类的方法
- 如何创建泛型函数,该函数将返回c++中任何级别指针的值
- C++限制泛型(和指针问题)中的类型
- 显示泛型指针中的值
- 从一个基类的指针对另一个基类的多重继承和泛型访问
- 多态树类中的双指针upcast(再次)、shared_ptr和泛型setChild函数
- 用泛型类指针作为参数声明函数指针的正确语法是什么
- 包装函数指针和函数对象在泛型代码中是如何工作的
- C#指针、迭代器和泛型
- 为返回指向函数的指针的泛型函数指定类
- 创建泛型链表,将下一个指针放在结构的开头
- 如何在c++中使用void指针(泛型)访问类成员