考虑以下代码:
template<typename T>
void doSomething(std::vector<T> arr) {
for (auto i = 0; i < arr.size(); ++i)
std::cout << arr[i] << std::endl;
}
int main()
{
doSomething(std::vector<int> { 1, 5, 7 });
}
在此示例中,正常使用模板。将三个整数的数组传递给一个函数,该函数具有类型为T
的数组的一般类型的参数。然后在此处指定它们的类型为int
:std::vector<int> { 1, 5, 7 }
。
我想要做的是初始化std::vector
以包含三种不同的类型。像这样:
doSomething(std::vector<T> { 1, "Hi", 2.7f });
这里没有指定的类型,std::vector
不包含整数。有没有办法做这样的事情?谢谢!
答案 0 :(得分:4)
使用std::vector
无法做到这一点。模板参数是唯一的。
检查std::tuple哪能做你想做的事。
std::tuple<int, std::string, float>
如果您需要更多通用性,则必须执行以下操作:
template<typename U, typename V, typename W>
void doSomething(std::tuple<U,V,W> t) { ... }
如果你想要一个具有任意数量元素的元组,那么你必须使用可变参数模板:
template<typename... Ts>
void doSomething(std::tuple<Ts...> data) {
// ...
}
答案 1 :(得分:0)
不,那不是C ++的工作方式。 C ++是一种静态类型的语言。必须在编译时声明所有变量的类型。
其他语言(如Perl,Python,Javascript等)是动态类型的。对象的类型是在运行时确定的,因此动态类型语言中的等效数组构造可以具有不同类型的值。