std::variant<std::string, int64_t, double, bool> m_value { std::string("") }; 这句c++ 17的代码 改写成c++ 11 或者c++ 14标准的代码 c++ 11和c++ 14没有std::variant特性
时间: 2024-04-18 20:33:08 浏览: 189
对于C++11和C++14标准,没有直接提供std::variant特性。但是,你可以使用std::tuple和一些辅助函数来模拟std::variant的行为。
以下是将你提供的代码改写为C++11和C++14标准的代码:
C++14写法:
```cpp
#include <iostream>
#include <string>
#include <tuple>
template <typename... Ts>
struct variant {
std::tuple<Ts...> data;
size_t index;
variant() : index(0), data(std::make_tuple(Ts{}...)) {}
template <typename T>
void set(const T& value) {
index = find_index<T, Ts...>();
std::get<T>(data) = value;
}
template <typename T>
T get() const {
if (index == find_index<T, Ts...>()) {
return std::get<T>(data);
} else {
throw std::bad_variant_access();
}
}
private:
template <typename T, typename First, typename... Rest>
static size_t find_index() {
if (std::is_same<T, First>::value) {
return 0;
} else {
return 1 + find_index<T, Rest...>();
}
}
template <typename T>
static size_t find_index() {
return 0; // Not found
}
};
int main() {
variant<std::string, int64_t, double, bool> m_value;
m_value.set(std::string(""));
// 示例用法
std::cout << m_value.get<std::string>() << std::endl;
return 0;
}
```
C++11写法:
```cpp
#include <iostream>
#include <string>
#include <tuple>
template <typename... Ts>
struct variant {
std::tuple<Ts...> data;
size_t index;
variant() : index(0), data(std::make_tuple(Ts{}...)) {}
template <typename T>
void set(const T& value) {
index = find_index<T, Ts...>();
std::get<T>(data) = value;
}
template <typename T>
T get() const {
if (index == find_index<T, Ts...>()) {
return std::get<T>(data);
} else {
throw std::bad_variant_access();
}
}
private:
template <typename T, typename First, typename... Rest>
static size_t find_index() {
if (std::is_same<T, First>::value) {
return 0;
} else {
return 1 + find_index<T, Rest...>();
}
}
template <typename T>
static size_t find_index() {
return 0; // Not found
}
};
int main() {
variant<std::string, int64_t, double, bool> m_value;
m_value.set(std::string(""));
// 示例用法
std::cout << m_value.get<std::string>() << std::endl;
return 0;
}
```
这里使用了一个自定义的variant类,它使用std::tuple来存储变量的值,并通过模板函数来设置和获取值。注意,在C++11中,我们使用std::is_same来检查类型是否匹配,并使用std::bad_variant_access来处理不匹配的情况。
希望这能满足你的需求!如果还有其他问题,请随时提问。
阅读全文