Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有转发的初始值设定项\u列表的模板参数推导_C++_Initializer List_Perfect Forwarding - Fatal编程技术网

C++ 具有转发的初始值设定项\u列表的模板参数推导

C++ 具有转发的初始值设定项\u列表的模板参数推导,c++,initializer-list,perfect-forwarding,C++,Initializer List,Perfect Forwarding,我想使用perf。使用初始值设定项_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&

我想使用perf。使用初始值设定项_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}); }
#包括
模板结构B{
_Tα;
_tb;};
模板无效条(B&a){}
模板空栏(B&a){}
模板结构A{
模板
无效foo(uu T&&a){
横杆(标准:正向(a));
} };
int main(){
A 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);
}
#包括
模板
结构B{
_Tα;
_tb;
};
模板
空栏(\u T&&v1、\u T&&v2){
B{v1,v2};
}
模板
空心条(_T&v1,_T&v2){
B{v1,v2};
}
模板
结构A{
模板
void foo(Args&&…Args){
棒(标准:正向(参数)…);
}
};
int main(){
A A;
a、 foo(1,3);
}

但是我想用可爱的花括号打电话给foo。

你不能。除了其他严重的缺点外,
std::initializer_list
不能简单地使用
{…}
语法来推导

a.foo(std::initializer_list{1, 3})
将正确地通过扣减,但您将无法使用它调用
bar
,因为您期望的是
B
的实例


就这样怎么样

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

{1,3}
没有类型,因此无法为“泛型”模板类型推导

您可以使用带有
std::initializer\u 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});
}
模板
结构A{
模板
无效foo(U&a){
横杆(标准:正向(a));
}
模板
void foo(标准::初始值设定项\u列表a){
bar(a);//假设bar(std::initializer_list)
}
};
int main(){
A A;
a、 foo({1,3});
}

注意命名:保留包含
的名称。看,我想你做不到。编译器将无法将
{1,3}
推断为
初始值设定项列表
。。。。还有像
\u T
这样的名字。