【发布时间】:2018-03-25 08:41:42
【问题描述】:
我有一个类模板,它的构造函数接受一个类型为模板参数的可调用对象。我希望推断出该类型,因此我不必在实例化类时指定它。
不幸的是,类型推导在下面的示例中不起作用。有没有办法让它工作?
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 函数类型(例如,当场定义的函数类型)。恕我直言,这是一种非常强大和有用的技术。
【问题讨论】:
-
问题的关键在于这是一个成员变量。会员意味着不扣除。
-
@StoryTeller 另一个问题当然是超级相关的(它甚至提到传递可调用对象作为这个用例)但我不确定它是否重复 - 另一个问题询问这是否是标准行为,而不是是否有某种方法可以使用其他技术进行演绎。
-
C<>此语法用于默认模板参数,而不是推导。 -
@Yakk Just
C不起作用,auto不允许用于数据成员。 -
@danra 那你倒霉了;标准不允许这样做,并且编译器可以支持的明显扩展不起作用。
标签: c++ templates c++17 type-deduction