根据构造函数参数进行模板类型推导

Dan*_*nra 5 c++ templates type-deduction c++17

我有一个类模板,其构造函数接受一个类型为模板参数的可调用对象.我想推断出那种类型,所以我不必在实例化类时指定它.

不幸的是,类型推导在以下示例中不起作用.有没有办法让它发挥作用?

template<typename F>
class C {
public:
   C(F&& f) : m_f{f} {}
private:
   F m_f;
};

class D {
public:
    static int s() { return 0; }
private:
   C<decltype(&s)> c {&s}; // OK
   C<> c2 {&s};            // error, not enough template parameters
};
Run Code Online (Sandbox Code Playgroud)

https://wandbox.org/permlink/8cphYR7lCvBA8ro4

注意这类可以在类数据成员中使用Can模板参数推导吗?但在这里,我要求获得类似工作的东西,而不是标准的合规性.

还有一点需要注意的是,虽然上面例子中重新指定模板参数的类型只是一个非DRY的不便(下面的一个答案建议用宏解决),我不确定它是如何可能的如果该实例是数据成员,则C具有F作为非全局lambda函数类型的实例(例如,在现场定义的那个).恕我直言,这种技术将非常强大和有用.

Bar*_*rry 3

你可以这样做:

decltype(C{&s}) c{&s};
Run Code Online (Sandbox Code Playgroud)

但我不知道有什么方法可以避免重复&s.