簡體   English   中英

將模板類實例類型別名傳遞給非成員模板函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM