带转发的initializer_list的模板参数推导

时间:2019-02-21 10:04:26

标签: c++ initializer-list perfect-forwarding

我想使用perf。使用initializer_list(大括号)进行转发,但是我编写可编译的代码失败。

如何在以下代码示例中使类型推导起作用?

$i getblockcount

我知道可以使用可变参数模板参数完成完美的转发,如下所示:

#include <utility>

template <class _T> struct B {
    _T a;
    _T b; };

template <class _T> void bar(B<_T>&& a) {}

template <class _T> void bar(B<_T>& a) {}

template <class _T> struct A {
    template <class __T>
    void foo(__T&& a) {
        bar(std::forward<__T>(a));
    } };

int main() {
    A<int> a;
    a.foo({1, 3}); }

但是我想用可爱的花括号给#include <utility> template <class _T> struct B { _T a; _T b; }; template <class _T> void bar(_T&& v1, _T&& v2) { B<_T> b{v1, v2}; } template <class _T> void bar(_T& v1, _T& v2) { B<_T> b{v1, v2}; } template <class _T> struct A { template <class... Args> void foo(Args&&... args) { bar(std::forward<Args>(args)...); } }; int main() { A<int> a; a.foo(1, 3); } 打电话。

2 个答案:

答案 0 :(得分:3)

{1, 3}没有类型,因此不能推导为“通用”模板类型。

您可以对std::initializer_list使用重载来处理它;

template <class T>
struct A {
    template <class U>
    void foo(U&& a) {
        bar(std::forward<U>(a));
    }

    template <class U>
    void foo(std::initializer_list<U> a) {
        bar(a); // assuming bar(std::initializer_list<U>)
    }

};

int main() {
    A<int> a;
    a.foo({1, 3});
}

答案 1 :(得分:1)

不能。除其他严重缺陷外,不能仅通过使用std::initializer_list语法来推断{...}

a.foo(std::initializer_list{1, 3})

可以正确地通过扣除,但是您不能像预期的bar实例那样调用B

live example on wandbox.org


那么

a.foo(B<int>{1, 3})