问题描述
我正在用 c++17 中的 std::variant
替换 Variant(基于 Poco)的实现。使用以下代码,我可以在适当的情况下将 Variant
对象转换为 std::variant
持有的任何类型。但是,我在另一个方向上遇到了困难 - 即如何将其他类型隐式转换为我的 Variant
。
#ifndef MINIMALVARIANT
#define MINIMALVARIANT
#include <iostream>
#include <utility>
#include <variant>
#include "gtest/gtest.h"
using variant_t = std::variant<std::string,bool,std::int32_t,std::uint32_t>;
class Variant {
public:
explicit Variant(variant_t value)
: variant_(std::move(value)) {};
Variant() = default;
template<class T>
T *get_if() {
return std::get_if<T>(&variant_);
}
template<typename T>
operator T() const {
return std::visit(
[&](auto const &val) {
if constexpr (std::is_convertible_v<decltype(val),T>) {
return T(val);
} else {
// T is not supported conversion type from typeid(value_)
throw std::bad_variant_access{};
return T{}; // oddly enough,this *is* necessary
}
},variant_);
}
bool operator==(const Variant &rhs) const {
return variant_ == rhs.variant_;
}
bool operator!=(const Variant &rhs) const {
return !(rhs == *this);
}
Variant &operator=(const Variant &setting) {
if (*this != setting) {
variant_ = setting.variant_;
};
return *this;
}
Variant &operator=(Variant &&setting) noexcept {
if (*this != setting) {
variant_ = std::move(setting.variant_);
};
return *this;
}
private:
variant_t variant_;
};
#endif // MINIMALVARIANT
我想要的行为几乎总结在以下测试中,如果它们确实可能的话(它们使用 Poco 实现,所以我假设它们使用 STL 实现)。
#include "gtest/gtest.h"
#include "MinimalVariant.h"
TEST(VariantTests,ImplicitConvertvariantToType){
Variant v(1234);
unsigned int u = v; // okay
ASSERT_EQ(u,1234); // pass
}
TEST(VariantTests,ImplicitConvertTypetoVariant){
unsigned int u = 1234;
Variant v;
// v = u; // error,assignment operators do not work
}
bool funcThatTakesAVariant(Variant v){
if (bool x = v.get_if<bool>()){
return x;
} else {
return false;
}
}
TEST(VariantTests,ImplicitConvertFuncParameter){
// ASSERT_TRUE(funcThatTakesAVariant(true)); // error,no implicit cast from bool to Variant
}
Variant funcThatReturnsAVariant(bool truth){
return truth; // compile error
}
TEST(VariantTests,ImplicitConvertReturnType){
Variant boolVariant = funcThatReturnsAVariant(true);
}
}
TEST(VariantTests,ImplicitConvertTypetoVariant){
unsigned int u = 1234;
Variant v;
v = u;
}
目前,我已经尝试对赋值运算符和模板化构造函数进行模板化,但到目前为止,我尝试过的一切都失败了。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)