gpt4 book ai didi

c++ - 如何从同一个函数返回不同的类型?

转载 作者:行者123 更新时间:2023-11-28 00:21:18 26 4
gpt4 key购买 nike

出于学习目的,我制作了自己的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 执行此操作的方式实际上是使用不同的签名——请注意,两个不同的版本采用不同的参数。一个接受引用,另一个接受指针。

 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);

关于c++ - 如何从同一个函数返回不同的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27365297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com