C++ 是否可以减少类型转换的写入?

C++ 是否可以减少类型转换的写入?,c++,templates,casting,C++,Templates,Casting,假设您在Windows上使用dlopen()或LoadLibrary()加载了一个动态库,并且希望从中获取一个符号并将其强制转换为特定的函数类型。这是如此令人难以置信的冗余写两次类型 void (*Test)(int, float) = reinterpret_cast<void (*Test)(int, float)>(dlsym(handle, "Test")); 有没有办法减少代码中的冗余?当从动态加载的库中检索大量函数时,每次强制转换写两次是很糟糕的 您可以

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

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

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

您可以使用一个邪恶的模板转换操作符来实现这一点

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));
}
struct代理{
公众:
代理(void*ptr):ptr(ptr){}
模板
运算符T()常量{
返回重新解释(ptr);
}
私人:
无效*ptr;
};
代理GetSym(void*handle,const char*symbol){
返回代理(dlsym(句柄,符号));
}

您认为为什么添加了
自动
?您使用的是哪种编译器?它是否有类似于
gcc
typeof
扩展?@brianbeuning不会有多大帮助,可以有这么多不同的函数签名,并定义每个变体的类型。。哎哟,这甚至不是一个合法的强制转换,因为函数指针和对象指针不能保证有任何共同的布局或大小。我能想到的最好办法是将从
dlsym
中得到的无效指针memcpy到函数指针中。@Kerrek在
dlsym
存在的平台上也可以。FWIW,POSIX规范本身建议使用
void(*TestFN)(int,float)*(无效**)(&fptr)=dlsym(手柄,sym)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));
}