簡體   English   中英

帶轉發的initializer_list的模板參數推導

[英]Template argument deduction for initializer_list with forwarding

我想使用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);
}

但是我想用可愛的花括號來稱呼foo

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

你不能 除其他嚴重缺陷外,不能僅使用{...}語法來推導std::initializer_list

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

可以正確地通過演繹,但是您不能像預期的B實例那樣調用bar

wandbox.org上的實時示例


怎么樣

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM