【问题标题】:How to return different types from same function?如何从同一个函数返回不同的类型?
【发布时间】:2014-12-08 19:21:55
【问题描述】:

出于学习目的,我制作了自己的Any 类型。我不明白,如何根据条件返回TypeType *。这是我的课堂草图:

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&lt;T&gt;(const utils::any &amp;obj)" function template "T utils::any_cast&lt;T&gt;(const utils::any &amp;obj)"
  • @Denis "[...] 取决于条件。" 取决于什么条件?
  • @PiotrS.,我存储变量is_pointer。如果是真的,我需要返回指针。

标签: c++ templates c++11 metaprogramming boost-any


【解决方案1】:

您不能返回不同的类型。 Boost 的做法实际上是使用不同的签名 - 请注意,两个不同的版本采用不同的参数。一个接受引用,另一个接受指针。

 template <typename T>   // this one will try to cast your any down to T
 T any_cast(any& );      // and return it if that succeeds, else throw

 template <typename T>   // this one will NOT throw, but will return
 T* any_cast(any* );     // a pointer instead

两个不同函数的用法示例:

any a = 5;
any_cast<double>(a); // throws

double* v = any_cast<double>(&a); // won't throw
assert(v == nullptr);

int* vi = any_cast<int>(&a); // succeeds
assert(*vi == 5);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    相关资源
    最近更新 更多