我正在尝试在C++中递归解引用指针。
如果传递的对象不是指针(包括智能指针),我只想返回对象本身,如果可能的话,通过引用返回。
我有这段代码:
我的代码在大多数情况下似乎都能正常工作,但是当给定函数指针时会出现问题,因为对函数指针进行解引用会导致与原始类型相同的函数指针,从而导致堆栈溢出。
那么,当解引用类型与原始对象具有相同类型时,我该如何“停止”解引用过程呢?
注意:
我看到我的问题已被标记为使用Boost的类似问题的重复问题; 然而,我需要一个没有Boost(或任何其他库)的解决方案。
示例:
如果传递的对象不是指针(包括智能指针),我只想返回对象本身,如果可能的话,通过引用返回。
我有这段代码:
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;
}