2017-04-10 218 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的所有特化都具有相同的初始代码 –