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

问题描述 投票:5回答:2

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

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

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函数类型(例如,当场定义的那个),以防该实例是数据成员。恕我直言,这种技术将非常强大和有用。

c++ templates c++17 type-deduction
2个回答
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;});
};

3
投票

你可以这样做:

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

但我不知道如何避免重复&s

© www.soinside.com 2019 - 2024. All rights reserved.