实现Variant
本节我们来实现一个简易的Any
类,可以用以来包装任意类型
首先,提到任意
这个词,就免不了使用模板
, 那么自然而言我们会想到一个非常简单形式:
template<typename T>
struct Any
{Any(const T& val) : _val(val){}T _val;
};
这样就实现了一个最简单的,可以包装任意类型的模板类,于是,可以这样来使用
Any<int> x (10);Any<double> y (2.2);//这里是模板类,故需要显示指明模板参数;若C++标准>=17,则可由编译器自动推导模板参数类型,可省略不写x = std::string("aaa"); //报错,因为Any<int>这个类,没有可以接受std::string类型的重载=运算符,所以无法这样写
很明显,以上x = std::string("aaa");
的写法会报错,因为模板类一旦实例化下来,那类型就固定了,例如以上的Any<int>
和Any<double>
以及Any<std::string>
是几个完全不同的类,自然无法使用Any<int>
类对象,来存储std::string
类型的值
那么该如何才能让一个
Any
类,既可以存储int
,也可以存储double
、std::string
类型的值呢?
显然Any
一定不能是一个模板类,否则就像上面一样,失去了在运行时动态切换数据类型的能力;那么可以这样将模板类型隐藏起来:
struct Any
{template<typename T>Any(const T& val) : _val(val){}};