在运行时根据某些元数据强制转换参数包值
Cast parameter pack values at runtime depending on some metadata
我整理了一个类来处理共享库的跨平台加载(Windows上的LoadLibrary/GetProcAddress和Linux上的dlopen/dlsym)。调用函数如下所示 -
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);
我尝试在每个参数包参数上使用转换函数,但这不起作用,因为它需要不同的返回类型。
使用 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;
演示
相关文章:
- C++转换参数初始化问题
- C2664 无法从'initializer list'转换参数
- 隐式可转换参数,但属于引用类型
- 传递到函数(C )时转换参数
- 了解错误 C2664:无法转换参数 1
- 错误 C2664:无法从'NvPhysicalGpuHandle'转换参数 1
- Unicode 字符问题/转换参数
- 在运行时根据某些元数据强制转换参数包值
- 错误 C2664:"errno_t wcstombs_s(size_t *,字符 *,size_t,常量 wchar_t *,size_t)":无法转换参数 4
- 错误C2664:无法转换参数错误
- 无法转换参数错误
- Boost.python自动转换参数
- "尝试升级使用已弃用的转换参数指定的输入文件"是什么意思?
- 是否可以在函数模板中转换参数C++?
- 错误C2664:无法转换参数(指纹传感器检测)
- 无法转换参数 - 模板错误
- 编译zxing时,Libconv无法转换参数
- C++ 无法转换参数
- std::p air<_Ty1,_Ty2>::p air<_Ty1,_Ty2>& 无法转换参数
- 无法转换参数-转换丢失限定符