根据构造函数参数

时间:2018-03-25 08:41:43

标签: c++ templates c++17 type-deduction

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

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

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
};

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

请注意,这与Can template parameter deduction be used in class data members?类似,但我在这里要求获得类似的工作,而不是标准合规性。

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

2 个答案:

答案 0 :(得分:4)

如果您的主要目标是避免两次输入&s,那么务实的解决方案是定义一个宏:

#define CC(name,value) decltype(C{value}) name{value}

class D {
public:
    static int s() { return 0; }
private:
    CC(c,&s);
    // lambda still not possible:
    // CC(c2,[](){return 42;});
};

答案 1 :(得分:3)

你可以这样做:

decltype(C{&s}) c{&s};

但我不知道避免重复&s的方法。