我有这个函数来读取内存,并返回位于指定地址的字符串(或内存中的任何类型(。但是我收到错误:
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);
}
注意:不要强制转换 C 样式
由于您使用的是C++因此应避免像(type) value
那样转换C样式。请参阅为什么使用 static_cast(x( 而不是 (int(x?对于类似C++的版本。
现在让我们解决您的问题。
模板专用化
这个想法是为每个使用的泛型类型专门化一个模板。
您的标头可能包含
template<typename T>
T ReadMemory(uint64_t addr, size_t size);
并且您的实现包含
/* 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;
}
对于要实现的所有类型,依此类推。请参阅如何显式实例化模板函数?了解更多信息。
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;
}
}
不能将数字转换为 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);
}