0

假设您在 Windows 上使用dlopen()or加载了一个动态库LoadLibrary(),并且您想从中获取一个符号并将其转换为特定的函数类型。两次写类型真是令人难以置信的多余!

void (*Test)(int, float) =
        reinterpret_cast<void (*Test)(int, float)>(dlsym(handle, "Test"));

我希望代码可以在没有 C++11 标准的情况下编译,因此auto关键字不是一个选项。我尝试使用模板,因为编译器通常可以从给定的参数中检测模板参数,但它似乎不适用于赋值的类型。

template <typename T>
T GetSym(void* handle, const char* symbol) {
    return (T) dlsym(handle, symbol);
}

void (*Test)(int, float) = GetSym(handle); // does not compile

有没有办法减少代码中的冗余?从动态加载的库中检索大量函数时,每次都编写两次转换是很糟糕的!

4

1 回答 1

2

您可以使用邪恶的模板化转换运算符来做到这一点。

struct proxy {
public:
    proxy(void* ptr) : ptr(ptr) {}

    template <typename T>
    operator T() const {
        return reinterpret_cast<T>(ptr);
    }
private:
    void* ptr;
};

proxy GetSym(void* handle, const char* symbol) {
    return proxy(dlsym(handle, symbol));
}
于 2013-10-31T13:43:33.390 回答