【发布时间】:2011-11-05 19:48:48
【问题描述】:
我正在尝试递归地取消引用 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); }
我的代码在大多数情况下似乎都能正常工作,但它在给定函数指针时会中断,因为取消引用函数指针会导致函数指针类型完全相同,从而导致堆栈溢出。 p>
那么,当解引用的类型与原始对象的类型相同时,如何“停止”解引用过程?
注意:
我看到我的问题已被标记为与使用 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;
}
【问题讨论】:
-
您能否具体说明您需要哪些编译器支持(C++98、C++03、C++11?)。
-
@fmaas:对不起,我对这有什么帮助有点困惑;你能详细说明一下吗?
-
我很想知道是什么导致了反对票...
-
@Mehrdad 一个拥有超过 125 名声望的 SO 社区成员认为这个问题并不明确或有用......关于主题:这是来自 boost
is_function.hpp@987654326 的一个很好的花絮@ 如果 MSVC9 处理得当,这可能有助于您寻求 SFINAE 触发器
标签: c++ templates pointers function-pointers visual-c++-2008