保罗万象的对象——Variant

对一个对象设置其可容纳的多种类型

通过类型对对象进行Set和Get,类型之间互不影响,一个类型只能又一个值

variant.h

/*
* variant.h
*
* Created on: 2012-3-9
* Author: vivence
*/

#ifndef VARIANT_H_
#define VARIANT_H_

namespace ghost{

template<typename... Tn>
class Variant;

template<>
class Variant<>{};

template<typename T, typename... Tn>
const T& GetVariant(const Variant<T, Tn...>& t);
template<typename T, typename... Tn>
T& GetVariant(Variant<T, Tn...>& t);

template<typename T, typename... Tn>
class Variant<T, Tn...> : public Variant<Tn...>{
T v_;

public:
const T& GetValue() const{return v_;}
T& GetValue(){return v_;}

template<typename TT>
const TT& Get() const{return GetVariant<TT>(*this);}
template<typename TT>
TT& Get(){return GetVariant<TT>(*this);}
template<typename TT>
void Set(const TT& t){Variant<Tn...>::Set(t);}
void Set(const T& t){v_ = t;}
};

template<typename T, typename... Tn>
const T& GetVariant(const Variant<T, Tn...>& t){return t.GetValue();}
template<typename T, typename... Tn>
T& GetVariant(Variant<T, Tn...>& t){return t.GetValue();}

} // namespace ghost

#endif /* VARIANT_H_ */

 

test.cpp

/*
* test.cpp
*
* Created on: 2012-3-9
* Author: vivence
*/

#include "variant.h"
#include <iostream>
#include <iomanip>

int main()
{
ghost::Variant<int, bool, char> test;
test.Set(1);
test.Set(false);
test.Set('a');
test.Set('b');
std::cout<<test.Get<int>()<<std::endl;
std::cout<<std::boolalpha<<test.Get<bool>()<<std::endl;
std::cout<<test.Get<char>()<<std::endl;
return 0;
}



转载于:https://www.cnblogs.com/EvilGhost/archive/2012/03/09/variant.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值