[英]Implicit conversion operator for templated types not automatically determined
我有一個模板類thing
有一個隱含的轉換操作符,就像如下:
#include <stdio.h>
template <typename T>
struct thing
{
T t;
operator const T&() const
{
return t;
}
};
template <typename T>
struct B
{
T t;
};
void fun(const int&) {
printf("int\n");
}
template <typename T>
void fun(const B<T>&) {
printf("B<T>\n");
}
int main()
{
thing<int> a;
fun(a);
thing<B<int>> b;
fun(b);
return 0;
}
使用thing<int>
調用fun(const int&)
,編譯器能夠找出調用隱式轉換運算符,以便將const T&
(在本例中為const int&
)傳遞給fun(const int&)
。
但是,對於一個thing<B<int>>
的thing<B<int>>
,編譯器無法弄清楚我希望調用fun(const B<T>&)
。
如何幫助編譯器解決這個問題而不將b
為const B<int>&
explicitely(例如使用static_cast<const B<int>&>(b)
)?
我的具體使用場景類似於我使用B
約束的代碼,其中約有10種不同類型的T
,即不是任意多個不同的T
s。 如果我必須創建~10個模板專業化,那就這樣吧。 但是,在這種情況下,我並不完全知道如何最好地重載struct B
但也許我走錯了路 - 可能存在更簡單/更優雅的解決方案嗎?
如何在不將
b
為const B<int>&
情況下幫助編譯器解決這個問題?
你不能。 模板不進行任何隱式轉換。 他們推斷出參數的類型,即他們使用的類型。
你可以做的一件事就是給你的包裝器添加一個get函數
template <typename T>
struct thing
{
T t;
operator const T&() const
{
return t;
}
const T& get() const
{
return t;
}
};
然后你可以稱之為fun
fun(b.get());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.