使用模板时,是否可以确定LVALUE的类型

When using templates, is it possible to determine the type of Lvalue?

本文关键字:LVALUE 类型 是否      更新时间:2023-10-16

很难将其放入文字中,因此这是一个示例:

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吗?

直觉可能是不可能的,但是我很想知道人们是否提出了工作。

怎么样?

auto foo = load_sym<int (*)(int)>("foo");

这是一个避免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*转换为任何类型的指针。

(请注意,void*转换为功能指针类型是有条件的,但我相信Posix需要它。)