【发布时间】:2014-12-08 19:21:55
【问题描述】:
出于学习目的,我制作了自己的Any 类型。我不明白,如何根据条件返回Type 或Type *。这是我的课堂草图:
class any
{
public:
template<class T>
any(T & d)
{
data_container = new container_impl<T>(d);
}
template<class T>
any(T* d)
{
is_pointer = true;
data_container = new container_impl<T>(d);
}
bool check_is_pointer() const;
template<class T>
T a_cast(size_t id) const
{
auto real_id = data_container->get_id();
if (real_id != id)
{
//throw new exeption
}
return static_cast<container_impl<T>&>(*data_container).get_data();
}
private:
class abstract_container
{
public:
virtual ~abstract_container() { }
virtual size_t get_id() const = 0;
};
template<typename T>
class container_impl : public abstract_container
{
public:
container_impl(T const& value)
{
data = value;
id = type_id<T>();
pointer_data = nullptr;
}
container_impl(T const* value)
{
pointer_data = value;
id = type_id<T*>();
}
T get_data()
{
return data;
}
size_t get_id() const override
{
return id;
}
private:
T data;
T const* pointer_data;
size_t id;
};
abstract_container *data_container = nullptr;
bool is_pointer = false;
};
template<class T>
T any_cast(any const& obj)
{
size_t id = type_id<T>();
return obj.a_cast<T>(id);
}
template<class T>
T* any_cast(any const& obj)
{
size_t id = type_id<T>();
return obj.a_cast<T>(id);
}
如您所见,我想创建两个函数any_cast,它们返回不同的类型。
【问题讨论】:
-
看看 boost::any (如果尚未完成)
-
您遇到了什么问题?
-
@dlf,
more than one instance of overloaded function "any_cast" matches the argument list: function template "T *utils::any_cast<T>(const utils::any &obj)" function template "T utils::any_cast<T>(const utils::any &obj)" -
@Denis "[...] 取决于条件。" 取决于什么条件?
-
@PiotrS.,我存储变量
is_pointer。如果是真的,我需要返回指针。
标签: c++ templates c++11 metaprogramming boost-any