gpt4 book ai didi

c++ - 是否可以在编译时检测到以下分配?

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:25 27 4
gpt4 key购买 nike

所以我有以下情况,很抱歉这个例子太长了,但它应该可以正确编译:

#include <tuple>
#include <functional>
#include <iostream>

#include <boost/mpl/fold.hpp>
#include <boost/mpl/push_front.hpp>
#include <boost/mpl/vector.hpp>


namespace mpl = boost::mpl;

namespace aux
{
template <typename ...Args>
struct to_vector
{ };

template <typename T, typename ...Args>
struct to_vector<T, Args...>
{ typedef typename mpl::push_front<typename to_vector<Args...>::type, T>::type type; };

template <typename T>
struct to_vector<T>
{ typedef typename mpl::vector<T> type; };

template <>
struct to_vector<>
{ typedef typename mpl::vector<> type; };

template <typename Dest, typename T>
struct tuple_adder
{
typedef decltype(std::tuple_cat(std::declval<Dest>(), std::make_tuple(std::declval<T>()))) type;
};

}

struct foo
{
struct storage
{ };

template <typename T>
struct placeholder : storage
{
placeholder(T&& t) : content(t)
{ }

T content;
};

storage* data;


template <typename ...Args>
foo(Args&&... args)
: data()
{
typedef typename mpl::fold<
typename aux::to_vector<Args...>::type,
std::tuple<>,
aux::tuple_adder<mpl::_1, mpl::_2>
>::type tuple_type;
// Instantiate the tuple
data = new placeholder<tuple_type>(std::make_tuple(std::forward<Args>(args)...));
}

template <typename ...Args>
void set(Args&&... args)
{
typedef typename mpl::fold<
typename aux::to_vector<Args...>::type,
std::tuple<>,
aux::tuple_adder<mpl::_1, mpl::_2>
>::type tuple_type;

auto tp = static_cast<placeholder<tuple_type>*>(data);
*tp = std::make_tuple(std::forward<Args>(args)...);
}
};


int main()
{
foo f(1, 2., std::string("Hello"));

f.set(4, 3., std::string("Bar"));

f.set(3., std::string("Bar"), 3.);
}

想法很简单,foo 利用类型删除来存储通过构造函数构造的tuple。那么限制应该是 set 仅在可变参数列表生成的 tuple 与保存的元组匹配时才允许(不幸的是,它的类型已被删除。)

现在我可以在运行时使用 typeid() 检测到这一点,但是,我想知道是否有一种方法可以在编译时进行相同的检测。唯一的限制是 foo 不能被模板化,并且 variant 不可用,因为我想允许 foo 根据需要用字段构造(全部在编译时指定...)

我担心答案是这是不可能的(由于类型删除),但是我希望有一些关于实现此功能的方法的想法...

最佳答案

编译时类型系统的要点在于它限制了对类型值的允许操作。如果两个对象是同一类型,则它们允许相同的允许操作。

所以不,编译器没有办法知道你想要允许什么,因为你已经消除了区别。

关于c++ - 是否可以在编译时检测到以下分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15157198/

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