用于存储不同级别指针的通用变量

时间:2015-06-27 08:24:52

标签: c++ 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;
}

这是我的null-checker原型。目前它非常静止。但我想扩展它以支持任何级别的指针检查。为此,我需要&#34; temp&#34;能够保持任何级别的指针,以便我可以运行无限循环,直到输入指针的所有级别被消耗和验证。我怎样才能做到这一点 ?请帮忙。

3 个答案:

答案 0 :(得分:1)

我不相信在不知道确切数量的情况下就可以直接解决这个问题。假设您可以逐级检查每个级别,如果它是否为NULL,但主要问题是您不知道必须搜索多远,所以最后如果您只是从一个地址到另一个地址,您可能会结束找不到NULL指针或永远不会结束验证循环因为你没有停止条件。 通过执行此操作,您还可以访问未分配的内存地址,该地址可能抛出或不抛出异常,因此您不能将此抛出的异常用作停止条件。

答案 1 :(得分:1)

我想你想要

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);
}

Live Demo

答案 2 :(得分:0)

免责声明:不要对这个答案进行投票(肮脏的黑客攻击)

扩展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))