c++ - 如何转发 std::initializer_list<T>?

标签 c++ c++11 initializer-list

我正在尝试转发一个 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())——但要小心切片!)。

关于c++ - 如何转发 std::initializer_list<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25592649/

相关文章:

c++ - 在所有版本的 C 和 C++ 中,有符号、无符号、长整型和短整型都是有效类型吗?

c++ - 在派生类的对象上使用指向基类成员函数的指针

c++ - 运算符 << 作为成员函数

c++ - std::array with unknown length 作为模板函数规范的类型

c++ - 不打印带有 int 的字符串构造函数

c++ - 如何将整数转换为字符串

c++ - 我想开始使用 C++ 内联初始化,有什么不好的情况吗?

c++ - CPU 缓存临界跨度测试根据访问类型给出意外结果

c++ - 创建抽象基类型引用的初始化列表

c++ - 没有 cbegin()/cend() 的 std::initializer_list