可以减少类型转换的写作?

时间:2013-10-31 13:39:31

标签: c++ templates casting

假设您在Windows上使用dlopen()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

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

1 个答案:

答案 0 :(得分: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));
}