可变模板(Variadic Templates) 是C++11引入的一项特性,允许函数或类接受可变数量的类型参数或值参数。std::tuple
和 std::variant
是常用的可变模板类型。std::tuple
可以存储固定数量和类型的元素,而 std::variant
可以存储多种类型中的一种。
std::tuple
std::variant
std::tuple
#include <iostream>
#include <tuple>
template<typename... Args>
void printTuple(const std::tuple<Args...>& t) {
std::apply([](const auto&... args) { ((std::cout << args << " "), ...); }, t);
std::cout << std::endl;
}
int main() {
auto t = std::make_tuple(1, 2.5, "Hello");
printTuple(t);
return 0;
}
std::variant
#include <iostream>
#include <variant>
void printVariant(const std::variant<int, double, std::string>& v) {
std::visit([](const auto& value) { std::cout << value << std::endl; }, v);
}
int main() {
std::variant<int, double, std::string> v = "World";
printVariant(v);
v = 3.14;
printVariant(v);
return 0;
}
原因:
std::variant
中的值时使用了错误的类型。解决方法:
std::is_same
或 std::is_convertible
进行类型检查。std::visit
安全地访问 std::variant
中的值。// 错误示例
std::variant<int, double> v = "Hello"; // 编译错误,字符串字面量不能转换为int或double
// 正确示例
std::variant<std::string, int> v = "Hello"; // 正确
通过上述方法,可以有效避免和处理在使用可变模板时可能遇到的问题。
领取专属 10元无门槛券
手把手带您无忧上云