2017-04-10 243 views
0

我有這個函數讀取內存,並返回位於指定地址的字符串(或任何類型駐留在內存中)。但我得到的錯誤:將模板類型名投射到uint64

error: invalid conversion from 'uint64_t to 'const char*'

我在做什麼錯?我以前用這種方式看過它。這裏是我想要做的代碼:

template<typename T> 
T ReadMemory(uint64_t addr, size_t size) 
{ 
    uint64_t some_address = addr; 
    size_t string_size = size; 
    uint64_t return_value; 
    //store address contents into return_value using driver 

    //cast typename on return_value 
    return (T)return_value; 
} 

int main() 
{ 
    string foo = ReadMemory<string>(some_address,some_size); 
} 
+2

首先,你可能是'std :: uintptr_t'而不是'uint64_t'? – aschepler

+0

否定的,我使用ULONG或uint64_t。無論哪種方式,與uintptr_t發生相同的投射問題 –

+4

鑄造到一個std ::字符串是沒有意義的。 –

回答

0

你不能將一個數字轉換成std :: string。相反,使用C++ 11中的std::to_string。例如,用模板特:

template<> 
std::string ReadMemory(uint64_t addr, size_t size) 
{ 
    uint64_t some_address = addr; 
    size_t string_size = size; 
    uint64_t return_value; 
    //store address contents into return_value using driver 

    //cast typename on return_value 
    return std::to_string(return_value); 
} 

template<> 
std::wstring ReadMemory(uint64_t addr, size_t size) 
{ 
    uint64_t some_address = addr; 
    size_t string_size = size; 
    uint64_t return_value; 
    //store address contents into return_value using driver 

    //cast typename on return_value 
    return std::to_wstring(return_value); 
} 
+1

這看起來更好!謝謝。 – datell

1

注意:不要投空調風格

由於您使用C++,你應該避免像(type) value鑄件C的風格。有關類似C++的版本,請參閱Why use static_cast(x) instead of (int)x?

現在讓我們來解決你的問題。

模板專業化

的想法是專門爲每個使用的通用類型的模板。

你的頭可以包含

template<typename T> 
T ReadMemory(uint64_t addr, size_t size); 

以及實現containes

/* type is std::string */ 
template<> 
std::string ReadMemory(uint64_t addr, size_t size){ 
    uint64_t some_address = addr; 
    size_t string_size = size; 
    uint64_t return_value; 
    //store address contents into return_value using driver 

    //cast typename on return_value 
    return std::to_string(return_value); 
} 

/* type is uint64_t */ 
template<> 
unit64_t ReadMemory(uint64_t addr, size_t size){ 
    uint64_t some_address = addr; 
    size_t string_size = size; 
    uint64_t return_value; 
    //store address contents into return_value using driver 

    //cast typename on return_value 
    return return_value; 
} 

等爲要實現所有類型。有關更多信息,請參見How do I explicitly instantiate a template function?

C++ 17的解決方案

C++ 17將添加一個名爲if constexpr一個驚人的新功能。只要編譯器支持這一點,你可以這樣使用它:

template<typename T> 
T ReadMemory(uint64_t addr, size_t size){ 
    uint64_t some_address = addr; 
    size_t string_size = size; 
    uint64_t return_value; 
    //store address contents into return_value using driver 

    /* type is std::string */ 
    if constexpr (std::is_same<T,std::string>::value){ 
     return std::to_string(return_value); 
    } 
    /* type is uint64_t */ 
    if constexpr (std::is_same<T,uint64_t>::value){ 
     return return_value; 
    } 
} 
+1

爲了避免代碼重複,我建議將從'return_value'到返回類型的轉換作爲它自己的專用函數;如果ReadMemory的所有特化都具有相同的初始代碼 –