2 changed files with 138 additions and 0 deletions
@ -0,0 +1,138 @@ |
|||
//
|
|||
// Created by zwsd
|
|||
//
|
|||
|
|||
#pragma once
|
|||
#include <algorithm>
|
|||
#include <fstream>
|
|||
#include <iostream>
|
|||
#include <list>
|
|||
#include <map>
|
|||
#include <memory>
|
|||
#include <set>
|
|||
#include <sstream>
|
|||
#include <string>
|
|||
#include <typeindex>
|
|||
#include <typeinfo>
|
|||
#include <vector>
|
|||
|
|||
/**
|
|||
* @brief |
|||
* |
|||
* service: ServiceContrainer |
|||
* |
|||
* 监听事件: |
|||
* 依赖状态: |
|||
* 依赖服务: |
|||
* 作用: |
|||
* |
|||
*/ |
|||
// std::shared_ptr<Buffer> buf(new Buffer());
|
|||
// Any any(buf);
|
|||
// std::shared_ptr<Buffer> b = any.Get<std::shared_ptr<Buffer>>();
|
|||
// assert(buf.get() == b.get());
|
|||
namespace iflytop { |
|||
namespace core { |
|||
using namespace std; |
|||
|
|||
class Any { |
|||
public: |
|||
Any() : content_(nullptr) {} |
|||
~Any() { delete content_; } |
|||
|
|||
template <typename ValueType> |
|||
explicit Any(const ValueType& value) : content_(new AnyHolder<ValueType>(value)) {} |
|||
|
|||
Any(const Any& other) : content_(other.content_ ? other.content_->clone() : nullptr) {} |
|||
|
|||
public: |
|||
Any& swap(Any& rhs) { |
|||
std::swap(content_, rhs.content_); |
|||
return *this; |
|||
} |
|||
|
|||
template <typename ValueType> |
|||
Any& operator=(const ValueType& rhs) { |
|||
Any(rhs).swap(*this); |
|||
return *this; |
|||
} |
|||
|
|||
Any& operator=(const Any& rhs) { |
|||
Any(rhs).swap(*this); |
|||
return *this; |
|||
} |
|||
|
|||
bool IsEmpty() const { return !content_; } |
|||
|
|||
const std::type_info& GetType() const { return content_ ? content_->GetType() : typeid(void); } |
|||
|
|||
template <typename ValueType> |
|||
ValueType operator()() const { |
|||
return Get<ValueType>(); |
|||
} |
|||
|
|||
template <typename ValueType> |
|||
ValueType Get() const { |
|||
if (GetType() == typeid(ValueType)) { |
|||
return static_cast<Any::AnyHolder<ValueType>*>(content_)->held_; |
|||
} else { |
|||
return ValueType(); |
|||
} |
|||
} |
|||
|
|||
protected: |
|||
class AnyPlaceHolder { |
|||
public: |
|||
virtual ~AnyPlaceHolder() {} |
|||
|
|||
public: |
|||
virtual const std::type_info& GetType() const = 0; |
|||
virtual AnyPlaceHolder* clone() const = 0; |
|||
}; |
|||
|
|||
template <typename ValueType> |
|||
class AnyHolder : public AnyPlaceHolder { |
|||
public: |
|||
AnyHolder(const ValueType& value) : held_(value) {} |
|||
|
|||
virtual const std::type_info& GetType() const { return typeid(ValueType); } |
|||
|
|||
virtual AnyPlaceHolder* clone() const { return new AnyHolder(held_); } |
|||
|
|||
ValueType held_; |
|||
}; |
|||
|
|||
protected: |
|||
AnyPlaceHolder* content_; |
|||
template <typename ValueType> |
|||
friend ValueType* any_cast(Any*); |
|||
}; |
|||
|
|||
template <typename ValueType> |
|||
ValueType* any_cast(Any* any) { |
|||
if (any && any->GetType() == typeid(ValueType)) { |
|||
return &(static_cast<Any::AnyHolder<ValueType>*>(any->content_)->held_); |
|||
} |
|||
|
|||
return nullptr; |
|||
} |
|||
|
|||
template <typename ValueType> |
|||
const ValueType* any_cast(const Any* any) { |
|||
return any_cast<ValueType>(const_cast<Any*>(any)); |
|||
} |
|||
|
|||
template <typename ValueType> |
|||
ValueType any_cast(const Any& any) { |
|||
const ValueType* result = any_cast<ValueType>(&any); |
|||
assert(result); |
|||
|
|||
if (!result) { |
|||
return ValueType(); |
|||
} |
|||
|
|||
return *result; |
|||
} |
|||
|
|||
} // namespace core
|
|||
} // namespace iflytop
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue