列出<T>?

我想转发一个std::initializer_list

no known conversion from 'std::initializer_list<A>' to 'std::initializer_list<B>'

这是测试代码

#include <iostream>

class B {
};

class A: public B {
};

class not_working {
    private:
    void fun(std::initializer_list<B> p) {
    }
    public:
    template<typename T>
    not_working(std::initializer_list<T> args) {
        fun(args);
    }
};

class working {
    private:
    void fun(std::initializer_list<B> p) {
    }
    public:
    working(std::initializer_list<B> args) {
        fun(args);
    }
};

int main(){    
    working{A{}, A{}};
    //not_working{A{}, A{}};
}

我如何转发std::initializer_list
not_working{(B)A{}, (B)A{}};

为什么这对我来说是个问题?

我有一个代理类,将构造函数参数转发给一个类。 像这样的东西:

 template<typename T>
 class proxy {
    T real;
    template<typename S> proxy(std::initializer_list<S> p): real(p) {}
    template<typename S...> proxy(S ... p): real(p ...) {}
};

你不能这样做,原因与你为什么不能将std::vector<A>转换为std::vector<B> 。 不同类型的容器是完全无关的。

“改变”容器类型的唯一方法是构造一个新类型的容器(例如, std::vector<B>(a.begin(), a.end()) - 但要注意切片!)。


从问题评论发布答案以提高解决方案的可见性:

标准的解决方案是使用std :: forward。 这无法转发初始化器列表。

template<typename T>
     class proxy {
        T real;
        public:
            template<typename ... S> proxy(S ... p): real{std::forward<S>(args)...} {}
    };

使用std :: move,也可以使用std :: initializer_list(由@dyp提供):

template<typename T>
 class proxy {
    T real;
    public:
        template<typename ... S> proxy(S ... p): real{std::move(p) ...} {}
};
链接地址: http://www.djcxy.com/p/22627.html

上一篇: list<T>?

下一篇: spam