我正在寫一個包裝模板類,它可以包裝一個任意類型,並用一些額外的語義灌輸它,但我無法弄清楚如何獲得重載解析正常工作。當通常通過比較競爭轉換序列的等級來解決的轉換不能由編譯器推斷時出現問題,因爲所討論的類型是模板參數而不是函數參數。例如,C++使用模板參數來解決重載
#include <type_traits>
template <typename T> class Wrapper {
T val;
public:
Wrapper() = default;
template <typename U> Wrapper(Wrapper<U> x) : val(x.val) {}
};
void foo(Wrapper<const char *>) {}
void foo(Wrapper<bool>) {}
int main() {
Wrapper<char *> cp;
foo(cp);
}
這裏,對foo()的調用是不明確的。期望的行爲將會是編譯器選擇void foo(Wrapper<const char *>)
,因爲如果cp
代替char *
和foo
代替void foo(const char *)
,它將會如此。這可能嗎?
編輯:感謝大家的快速反應,但也許我應該更清楚。我上面給出的僅僅是一個例子。我需要的是對以下問題的一般解決方案:給定任意類型T
,U
和V
,假設C++的內置過載分辨率會優於T
→U
而不是T
→V
。那麼我怎樣才能確保C++更喜歡Wrapper<T>
- >Wrapper<U>
高於Wrapper<T>
- >Wrapper<V>
?
我做了這個澄清,因爲它似乎是專門解決重載決議的某些方面,如cv-qualifiedness,而我真的需要一個通用的解決方案。
我認爲這是最好的答案,儘管這不是我一直期待的。這種技術是我提出的過載問題的一般解決方案......我希望有一個解決方案,它不需要重載函數的包裝,但我現在確信這是不可能的。謝謝! – Fidget324