使用模板时,是否可以确定左值的类型?

时间:2015-05-04 21:46:45

标签: c++ templates type-deduction

很难用文字表达,所以这是一个例子:

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而无需将其明确指定为模板参数?

直觉觉得它可能不可能,但我很想知道人们是否已经找到了解决方法。

2 个答案:

答案 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需要它。)