![](/img/trans.png)
[英]Implicitly pass the "this" OR the "type" of the calling class to a non-member template function
[英]Pass template class instance type alias to non-member template function
有沒有一種方法可以使用Base
類對象指針將模板類實例類型的別名( ClassTmplt/DerivedFloat::InternalType
)傳遞給外部非成員模板函數( DoSomething
)(例如最后兩條test()
函數的注釋行)?
class Base
{
};
template <typename T>
class ClassTmplt:
public Base
{
public:
using InternalType = T;
};
class DerivedFloat:
public ClassTmplt<float>
{
};
template <typename T, typename TIn>
void DoSomething(const TIn value)
{
T val = T(value);
std::cout << val << " | " << typeid(val).name() << " | " << typeid(value).name() << std::endl;
}
template <typename T>
typename T::InternalType PassInternalType(T* obj)
{
return T::InternalType;
//return obj::InternalType
}
void test()
{
Base* obj = new DerivedFloat;
DoSomething<float>(1.23);
DoSomething<DerivedFloat::InternalType>(1UL);
//DoSomething<(*obj)::InternalType>(-123);
//DoSomething<PassInternalType(obj)>(4.56);
}
不,請考慮:
void f(Base* ptr) {
// What type does ptr point to?
// The runtime derived type might not exist when this function compiles
}
由於指針的動態類型僅在運行時才知道,因此編譯器在編譯函數時無法訪問它。
如果定義可用,則可能會有更多選項,但是所有這些選項都需要您事先了解要支持的整個類型集,並且可能需要先轉換為下一個。 (如果您選擇這條路線,輸入“ id”可能會有所幫助。)
您也許可以使用訪客模式來構建一些有限的工作設計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.