雖然想在這裏回答一個問題,我發現這個問題:遞歸取消引用指針
How to recursively dereference pointer (C++03)?
從答案改編代碼如下:
template<typename T> T& dereference(T &v) { return v; }
template<typename T> const T& dereference(const T &v) { return v; }
template <typename T>
typename std::enable_if<!std::is_pointer<T>::value, T&>::type
dereference(T *v) {
return dereference(*v);
}
然而,在這個測試中它是無法將指針指針解除引用爲值類型:
template <typename T>
class A
{
public:
bool compare(T a, T b){
return dereference(a) < dereference(b);
}
};
int main()
{
int u = 10;
int *v = &u;
int **w = &v;
int i = 5;
int *j = &i;
int **k = &j;
A<int> a;
A<int*> b;
A<int**> c;
std::cout << a.compare(i, u) << std::endl;
std::cout << b.compare(j, v) << std::endl;
// This fails - 5 < 10 == 0
std::cout << **k << " < " << **w << " == " << c.compare(k, w) << std::endl;
return 0;
}
顯然,w
和k
只被解除一次,這導致在兩個指針上調用operator<
。
我可以通過添加以下解決此問題:
template <typename T>
typename std::enable_if<!std::is_pointer<T>::value, T&>::type
dereference(T **v) {
return dereference(*v);
}
但隨後會失敗int***
。
有什麼辦法可以遞歸地做到這一點,而無需手動添加級別?
注意這只是「理論上」的問題。
謝謝!我希望我能接受這兩個答案,因爲我知道你們都在這方面投入了時間! –
這可能比我的回答好得多,因爲我的CV不符合各種資歷。 –