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

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

我想用perf。使用initializer_list(花括号)转发,但是我编写的代码失败了。

如何在下面的代码示例中进行类型推导?

#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);
}

但我想用可爱的花括号打电话给qazxsw poi。

c++ initializer-list perfect-forwarding
2个回答
3
投票

foo没有类型,因此无法推断出“通用”模板类型。

您可以使用{1, 3}重载来处理它;

std::initializer_list

1
投票

你不能。除了其他严重的缺点,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}); } 无法通过简单地使用std::initializer_list语法推断出来。

{...}

将正确地通过演绎,但你将无法使用它调用a.foo(std::initializer_list{1, 3}) ,因为你期望bar的实例。

B


怎么样

live example on wandbox.org

?

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