我有一个类模板,其构造函数接受一个类型为模板参数的可调用对象。我想推断出那种类型,所以我不必在实例化类时指定它。
不幸的是,类型推导在以下示例中不起作用。有没有办法让它发挥作用?
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
的实例。恕我直言,这种技术将非常强大和有用。
答案 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
的方法。