如何递归解引用指针(c++ 03)

How to recursively dereference pointer (C++03)?

本文关键字:指针 c++ 引用 递归 何递归      更新时间:2023-10-16

我试图在c++中递归解引用一个指针。

如果传递的对象是而不是指针(包括智能指针),我只想返回对象本身,如果可能的话,通过引用。

我有这样的代码:

template<typename T> static T &dereference(T &v) { return v; }
template<typename T> static const T &dereference(const T &v) { return v; }
template<typename T> static T &dereference(T *v) { return dereference(*v); }

我的代码在大多数情况下似乎工作得很好,但是当给定函数指针时,它会中断,因为解引用函数指针会导致与函数指针完全相同的类型,从而导致堆栈溢出。

那么,我该如何"停止"呢?解引用类型与原始对象具有相同类型时的解引用过程?

注意:

我看到我的问题被标记为使用Boost的类似问题的副本;然而,我需要一个没有Boost(或任何其他库)的解决方案


的例子:

template<typename T> T &dereference(T &v) { return v; }
template<typename T> const T &dereference(const T &v) { return v; }
template<typename T> T &dereference(T *v) { return dereference(*v); }
template<typename TCallback /* void(int) */>
void invoke(TCallback callback) { dereference(callback)(); }
void callback() { }
struct Callback {
     static void callback() { }
     void operator()() { }
};
int main() {
    Callback obj;
    invoke(Callback());          // Should work (and does)
    invoke(obj);                 // Should also work (and does)
    invoke(&obj);                // Should also work (and does)
    invoke(Callback::callback);  // Should also work (but doesn't)
    invoke(&Callback::callback); // Should also work (but doesn't)
    invoke(callback);            // Should also work (but doesn't)
    invoke(&callback);           // Should also work (but doesn't)
    return 0;
}

完全没有依赖,简单,应该可以在MSVC-2008上工作。

template<typename T>
struct is_function
{
    static char     check(...);
    static double   check(const volatile void*); // function pointers are not convertible to void*
    static T        from;
    enum { value = sizeof(check(from)) != sizeof(char) };
};
template<bool, typename T = void>
struct enable_if{};
template<typename T>
struct enable_if<true, T>{typedef T type;};
template<typename T> 
T& dereference(T &v){return v;}
template<typename T> 
const T& dereference(const T& v){return v;}
template<typename T> 
typename enable_if<!is_function<T>::value, T&>::type dereference(T* v){return dereference(*v);}