将模板类型名称转换为 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);
}

注意:不要强制转换 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);
}

最新更新