很难用文字表达,所以这是一个例子:
int (*foo)(int) = load_sym<decltype(foo)>("foo");
template <typename T>
T load_sym(char *sym) {
/* some other stuff */
return (T)dlsym(sym);
}
如果可能的话,我想省略decltype(foo)
部分以使其简洁明了。问题是,我是否可以确定T
而无需将其明确指定为模板参数?
直觉觉得它可能不可能,但我很想知道人们是否已经找到了解决方法。
答案 0 :(得分:5)
这个怎么样?
auto foo = load_sym<int (*)(int)>("foo");
答案 1 :(得分:1)
这是一个避免res/drawable
的解决方案,适用于非静态数据成员,但有点难看。
auto
现在你可以做到
struct Symbol {
Symbol(void* p) : p(p) {}
template <typename T>
operator T*() { return reinterpret_cast<T*>(p); }
void* p;
};
Symbol load_sym(const char *sym) {
/* some other stuff */
return dlsym(sym);
}
int (*foo)(int) = load_sym("foo");
类只存储Symbol
的返回值,但提供了一个转换运算符模板,可用于将load_sym
转换为任何类型的指针。
(请注意,有条件地支持将void*
转换为函数指针类型,但我相信POSIX需要它。)