我有一个类模板,其构造函数接受一个类型为模板参数的可调用对象。我想推断出那种类型,所以我不必在实例化类时指定它。
不幸的是,类型推导在以下示例中不起作用。有没有办法让它发挥作用?
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函数类型(例如,当场定义的那个),以防该实例是数据成员。恕我直言,这种技术将非常强大和有用。
如果您的主要目标是避免两次输入&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;});
};
你可以这样做:
decltype(C{&s}) c{&s};
但我不知道如何避免重复&s
。