在C ++中将函数返回类型指定为模板参数

arslancharyev31

我正在尝试为我的函数提供其模板参数的返回类型(以改进类型检查),这是一个函数参考。到目前为止,这是我尝试过的事情:

#include <Windows.h>

模板<typename func> 
decltype(auto)proxyFunction(LPCSTR dllPath,LPCSTR functionName){ 
    auto funcType = decltype(func); 

    funcType funcPtr =(funcType)GetProcAddress(LoadLibraryA(dllPath),functionName); 

    if(funcPtr)
        std :: cout <<“代理成功” << std :: endl; 
    否则
        std :: cout <<“代理失败” << std :: endl; 
    
    返回funcPtr; 
} 

BOOL GetFileVersionInfoProxy(LPCSTR lptstrFilename,DWORD dwHandle,DWORD dwLen,LPVOID lpData){ 
    auto getFileVersion = proxyFunction <GetFileVersionInfoProxy>(“ C:\\ Windows \\ System32 \\ Version.dll”,“ GetFileVersionInfoA”);
}

但是,关于以下内容,我遇到了以下编译时错误proxyFunction

没有与参数列表匹配的函数模板实例,参数类型为:(const char [32],const char [20])

我不太确定该错误的处理方式,因为它相当模糊。所以我想知道是否有人可以解释我的代码段中存在什么问题?

PS我正在使用MS VS 2019和C ++ 17标准,以防万一。

雷米·勒博

您的func模板参数已经是您要返回的类型,因此,请照原样使用它,而无需使用decltype(auto)而您的使用auto funcType = decltype(func);是完全错误的。

尝试以下方法:

template <typename funcType>
funcType proxyFunction(LPCSTR dllPath, LPCSTR functionName)
{
    funcType funcPtr = (funcType) GetProcAddress(LoadLibraryA(dllPath), functionName);

    if (funcPtr)
        std::cout << "Proxy success" << std::endl;
    else
        std::cout << "Proxy fail" << std::endl;
    
    return funcPtr;
}

BOOL GetFileVersionInfoProxy(LPCSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData)
{
    using GetFileVersionInfoA_FuncType = BOOL (WINAPI *)(LPCSTR, DWORD, DWORD, LPVOID);

    auto getFileVersion = proxyFunction<GetFileVersionInfoA_FuncType>("C:\\Windows\\System32\\Version.dll", "GetFileVersionInfoA");
    if (getFileVersion)
        return getFileVersion(lptstrFilename, dwHandle, dwLen, lpData);

    return FALSE;
}

另外,如果让编译器为您推断出模板参数,则可以省略传递模板参数:

template <typename funcType>
bool proxyFunction(LPCSTR dllPath, LPCSTR functionName, funcType &funcPtr)
{
    funcPtr = (funcType) GetProcAddress(LoadLibraryA(dllPath), functionName);

    if (funcPtr)
        std::cout << "Proxy success" << std::endl;
    else
        std::cout << "Proxy fail" << std::endl;
    
    return (funcPtr != nullptr);
}

BOOL GetFileVersionInfoProxy(LPCSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData)
{
    using GetFileVersionInfoA_FuncType = BOOL (WINAPI *)(LPCSTR, DWORD, DWORD, LPVOID);

    GetFileVersionInfoA_FuncType getFileVersion;
    if (proxyFunction("C:\\Windows\\System32\\Version.dll", "GetFileVersionInfoA", getFileVersion))
        return getFileVersion(lptstrFilename, dwHandle, dwLen, lpData);

    return FALSE;
}

更新:基于@MooingDuck的注释,看来您实际上是在尝试将代理函数传递给模板,并推断出与DLL函数一起使用的必要参数和返回类型。如果是这样,请尝试以下类似方法:

template <typename RetType, typename... ArgTypes>
struct proxyTraits
{
    using funcType = RetType (WINAPI *)(ArgTypes...);
};

template <typename RetType, typename... ArgTypes>
auto proxyFunction(
    LPCSTR dllPath,
    LPCSTR functionName,
    RetType (*proxy)(ArgTypes...))
{
    using funcType = typename proxyTraits<RetType, ArgTypes...>::funcType;
    funcType funcPtr = (funcType) GetProcAddress(LoadLibraryA(dllPath), functionName);

    if (funcPtr)
        std::cout << "Proxy success" << std::endl;
    else
        std::cout << "Proxy fail" << std::endl;
    
    return funcPtr;
}

BOOL GetFileVersionInfoProxy(LPCSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData)
{
    auto getFileVersion = proxyFunction("C:\\Windows\\System32\\Version.dll", "GetFileVersionInfoA", &GetFileVersionInfoProxy);
    if (getFileVersion)
        return getFileVersion(lptstrFilename, dwHandle, dwLen, lpData);

    return FALSE;
}

现场演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++模板函数根据模板参数返回类型

来自分类Dev

C ++:具有明确指定的引用类型作为类型参数的模板函数

来自分类Dev

如何在Rust中将类型参数指定为函数参数?

来自分类Dev

C++ 模板在参数中指定类型

来自分类Dev

如何在ocaml中将函数参数和返回类型指定为List?

来自分类Dev

C ++模板;作为模板参数传递的函数的自动推论返回类型;

来自分类Dev

C++ 函数模板:必须使用 & 作为参数类型和返回类型吗?

来自分类Dev

在C ++中的模板实例化中将带有构造函数的类用作类型参数

来自分类Dev

C ++模板函数,在仍允许内联的同时指定回调函子/ lambda的参数类型?

来自分类Dev

C ++类模板作为函数返回类型

来自分类Dev

在C ++中将函数作为模板类型传递并推导其类型

来自分类Dev

C ++使用函数参数类型进行模板参数推导

来自分类Dev

根据C ++模板函数的参数类型解析为不同的类型

来自分类Dev

C ++模板返回参数

来自分类Dev

如何在TypeScript中将函数的返回类型指定为名称空间类型,以便提出建议

来自分类Dev

C ++返回模板函数

来自分类Dev

C ++函数类型模板参数推导规则

来自分类Dev

模板函数C ++,它接受参数U并返回T

来自分类Dev

C ++模板函数能否在返回参数上重载?

来自分类Dev

C ++类模板复制构造函数返回类型

来自分类Dev

模板类的C ++成员函数的自动返回类型

来自分类Dev

函数C ++中具有返回类型大小的模板?

来自分类Dev

C ++类模板复制构造函数返回类型

来自分类Dev

为什么需要将比较函数类型指定为模板参数?

来自分类Dev

没有在C中指定返回类型的函数

来自分类Dev

C ++-指定模板值类型

来自分类Dev

如何在Kotlin中将“自己的类型”指定为返回类型

来自分类Dev

未知类型的C ++模板参数

来自分类Dev

c ++模板参数类型推断

Related 相关文章

  1. 1

    C ++模板函数根据模板参数返回类型

  2. 2

    C ++:具有明确指定的引用类型作为类型参数的模板函数

  3. 3

    如何在Rust中将类型参数指定为函数参数?

  4. 4

    C++ 模板在参数中指定类型

  5. 5

    如何在ocaml中将函数参数和返回类型指定为List?

  6. 6

    C ++模板;作为模板参数传递的函数的自动推论返回类型;

  7. 7

    C++ 函数模板:必须使用 & 作为参数类型和返回类型吗?

  8. 8

    在C ++中的模板实例化中将带有构造函数的类用作类型参数

  9. 9

    C ++模板函数,在仍允许内联的同时指定回调函子/ lambda的参数类型?

  10. 10

    C ++类模板作为函数返回类型

  11. 11

    在C ++中将函数作为模板类型传递并推导其类型

  12. 12

    C ++使用函数参数类型进行模板参数推导

  13. 13

    根据C ++模板函数的参数类型解析为不同的类型

  14. 14

    C ++模板返回参数

  15. 15

    如何在TypeScript中将函数的返回类型指定为名称空间类型,以便提出建议

  16. 16

    C ++返回模板函数

  17. 17

    C ++函数类型模板参数推导规则

  18. 18

    模板函数C ++,它接受参数U并返回T

  19. 19

    C ++模板函数能否在返回参数上重载?

  20. 20

    C ++类模板复制构造函数返回类型

  21. 21

    模板类的C ++成员函数的自动返回类型

  22. 22

    函数C ++中具有返回类型大小的模板?

  23. 23

    C ++类模板复制构造函数返回类型

  24. 24

    为什么需要将比较函数类型指定为模板参数?

  25. 25

    没有在C中指定返回类型的函数

  26. 26

    C ++-指定模板值类型

  27. 27

    如何在Kotlin中将“自己的类型”指定为返回类型

  28. 28

    未知类型的C ++模板参数

  29. 29

    c ++模板参数类型推断

热门标签

归档