gpt4 book ai didi

c++ - 根据某些元数据在运行时转换参数包值

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:05 25 4
gpt4 key购买 nike

我整理了一个类来处理共享库的跨平台加载(Windows 上的 LoadLibrary/GetProcAddress 和 Linux 上的 dlopen/dlsym)。 Call 函数看起来像这样 -

template <typename ReturnT, typename... Args>
ReturnT Call(const std::string& name, Args... args)
{
void* functionAddress = GetFunctionAddress(name);

typedef ReturnT(CALLING_CONVENTION * variadicFunctionPointer)(Args...);

auto functionPointer = reinterpret_cast<variadicFunctionPointer>(functionAddress);
const auto returnValue = (*functionPointer)(std::forward<Args>(args)...);

return returnValue;
}

用法如下-

 Library someLib("someLib.dll");

auto ret = someLib.Call<bool>("SomeCall", "StringParam", 1, true, nullptr, nullptr);

这很好用,但我遇到的问题是尝试在运行时动态转换每个参数。我想获取一些 json,加载相关的库,转换每个参数(我们从 json 中知道参数类型),然后进行调用。

 auto result = someLib.Call<bool>(function,
std::stoi(params.at(0)["value"].get<std::string>()),
reinterpret_cast<const uint8_t*>(params.at(1)["value"].get<std::string>().c_str()),
std::stoi(params.at(2)["value"].get<std::string>()),
digest.data(),
&bufferSize);

我试过在每个参数包 arg 上使用转换函数,但这行不通,因为它需要不同的返回类型。

这可以使用 C++14 吗?

最佳答案

使用 std::variant (C++17),你可能会这样做:

template <typename Ret>
struct Caller
{
Caller(const std::string& name) : name(name) {}

template <typename ... Ts>
Ret operator ()(Ts... args) const
{
void* functionAddress = GetFunctionAddress(name);

using Func = Ret(Ts...);

auto functionPointer = reinterpret_cast<Func*>(functionAddress);
return (*functionPointer)(std::forward<Ts>(args)...);
}

std::string name;
};

然后:

// Variant constructed from json
std::variant<int, std::string> s{"Hello"};
std::variant<int, std::string> a{40};
std::variant<int, std::string> b{2};

std::visit(Caller<void>("print"), s);
std::cout << std::visit(Caller<int>("add"), a, b) << std::endl;

Demo

关于c++ - 根据某些元数据在运行时转换参数包值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54200530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com