[英]C++ How to create a constant pointer to a function?
我想要一個具有指向函數的常量指針的類作為成員。 但是,我正在創建具有恆定返回值的函數( 我在調試時遇到的一個奇怪的功能)。
麻煩的聲明是:
// ...
template<typename T, typename ComparableValue>
class TimestampedValueHeap {
public:
TimestampedValueHeap(
const ComparableValue (*)(const T&),
const big_unsigned (*)(const T&)
);
protected:
const ComparableValue (*getValue)(const T&);
const big_unsigned (*getTimestamp)(const T&);
};
// ...
template<typename T, typename ComparableValue>
class TimestampedValueMinHeap : TimestampedValueHeap<T, ComparableValue> {
public:
TimestampedValueMinHeap(
const ComparableValue (*)(const T&),
const big_unsigned (*)(const T&)
);
};
// ...
這是沒有 const 的最小 WORKING 示例。 我正在使用 C++14。
#include <utility>
using namespace std;
typedef unsigned long long big_unsigned;
template <typename T, typename U>
T getFirst(const pair<T, U>& x) {
return x.first;
}
template<typename T, typename U>
U getSecond(const pair<T, U>& x) {
return x.second;
}
// ==================================================
// TimestampedValueHeap
// ==================================================
template<typename T, typename ComparableValue>
class TimestampedValueHeap {
public:
TimestampedValueHeap(
ComparableValue (*)(const T&),
big_unsigned (*)(const T&)
);
protected:
ComparableValue (*getValue)(const T&);
big_unsigned (*getTimestamp)(const T&);
};
template<typename T, typename ComparableValue>
TimestampedValueHeap<T, ComparableValue>::TimestampedValueHeap(
ComparableValue (*getValue)(const T&),
big_unsigned (*getTimestamp)(const T&)
): getValue(getValue), getTimestamp(getTimestamp) {
}
// ==================================================
// TimestampedValueMinHeap
// ==================================================
template<typename T, typename ComparableValue>
class TimestampedValueMinHeap : TimestampedValueHeap<T, ComparableValue> {
public:
TimestampedValueMinHeap(
ComparableValue (*)(const T&),
big_unsigned (*)(const T&)
);
};
template<typename T, typename ComparableValue>
TimestampedValueMinHeap<T, ComparableValue>::TimestampedValueMinHeap(
ComparableValue (*getValue)(const T&),
big_unsigned (*getTimestamp)(const T&)
): TimestampedValueHeap<T, ComparableValue>::TimestampedValueHeap(getValue, getTimestamp) {
}
int main() {
const TimestampedValueMinHeap<pair<int, big_unsigned>, int> minHeap(
getFirst<int, big_unsigned>,
getSecond<int, big_unsigned>
);
return 0;
}
這是添加了 const 的 BROKEN 示例。
#include <utility>
using namespace std;
typedef unsigned long long big_unsigned;
template <typename T, typename U>
T getFirst(const pair<T, U>& x) {
return x.first;
}
template<typename T, typename U>
U getSecond(const pair<T, U>& x) {
return x.second;
}
// ==================================================
// TimestampedValueHeap
// ==================================================
template<typename T, typename ComparableValue>
class TimestampedValueHeap {
public:
TimestampedValueHeap(
const ComparableValue (*)(const T&),
const big_unsigned (*)(const T&)
);
protected:
const ComparableValue (*getValue)(const T&);
const big_unsigned (*getTimestamp)(const T&);
};
template<typename T, typename ComparableValue>
TimestampedValueHeap<T, ComparableValue>::TimestampedValueHeap(
const ComparableValue (*getValue)(const T&),
const big_unsigned (*getTimestamp)(const T&)
): getValue(getValue), getTimestamp(getTimestamp) {
}
// ==================================================
// TimestampedValueMinHeap
// ==================================================
template<typename T, typename ComparableValue>
class TimestampedValueMinHeap : TimestampedValueHeap<T, ComparableValue> {
public:
TimestampedValueMinHeap(
const ComparableValue (*)(const T&),
const big_unsigned (*)(const T&)
);
};
template<typename T, typename ComparableValue>
TimestampedValueMinHeap<T, ComparableValue>::TimestampedValueMinHeap(
const ComparableValue (*getValue)(const T&),
const big_unsigned (*getTimestamp)(const T&)
): TimestampedValueHeap<T, ComparableValue>::TimestampedValueHeap(getValue, getTimestamp) {
}
int main() {
const TimestampedValueMinHeap<pair<int, big_unsigned>, int> minHeap(
getFirst<int, big_unsigned>,
getSecond<int, big_unsigned>
);
return 0;
}
您應該得到一個編譯錯誤,例如:
No matching constructor for initialization of 'const TimestampedValueMinHeap<pair<int, big_unsigned>, int>' (aka 'const TimestampedValueMinHeap<pair<int, unsigned long long>, int>')
但是,如果您只是轉換參數,它就可以工作。
// ...
int main() {
const TimestampedValueMinHeap<pair<int, big_unsigned>, int> minHeap(
(const int (*)(const pair<int, big_unsigned>&)) getFirst<int, big_unsigned>,
(const big_unsigned (*)(const pair<int, big_unsigned>&)) getSecond<int, big_unsigned>
);
return 0;
}
嘗試分步進行,它也更具可讀性,
using getValue_ptr_type = ComparableValue (*)(const T&);
using const_getValue_ptr_type = const getValue_ptr_type;
const_getValue_ptr_type getValue;
或使用 EAST const (我最喜歡的)
ComparableValue (* const getValue)(const T&);
big_unsigned (* const getTimestamp)(const T&);
https://godbolt.org/z/z7P6P3sKz
注意:@MatthewM。 正確地說這不是 EAST const 或 const WEST 的問題。 這是唯一正確的方法(對於一個班輪)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.