gpt4 book ai didi

c++ - MPL替换而不类型转换聚变容器

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:15 25 4
gpt4 key购买 nike

我有这门课

struct MyChildrenNeedsSpace : HaveChildren<MyChildrenNeedsSpace>
{
typedef childrenListType<string, string, string, string> context;

const context children;

MyChildrenNeedsSpace() : children("this", "sentence", "needs", "spaces")
{
std::cout << endl << "The children type is:" << endl << typeid(children).name() << endl;
}
};

它使用 CRTP 允许 HaveChildren 类访问其子成员变量。

childrenListType 是继承自 boost::fusion::vector 的类。

我想以编程方式使子成员变量在每个字符串之间包含一个空间类。

所以如果我输入:

<string,string>

children 变成了:

<string, space,string>

如果我输入:

<string,string,string>

变成

<string,space,string,space,string>

等等

我正在使用 boost fusion,所以它必须在编译时。

我试过这样做:

struct MyChildrenNeedsSpaceWithReplacer : HaveChildren<MyChildrenNeedsSpaceWithReplacer>
{
typedef childrenListType<string, string, string, string> context;
typedef boost::mpl::replace< context, string, stringAndSpace >::type replacedContext;

const replacedContext children;

MyChildrenNeedsSpaceWithReplacer() : children( "this" ,"sentence" , "needs" , "spaces")
{
std::cout << endl << "The children type is:" << endl <<typeid(children).name() << endl;
}
};

但是随后 MPL:replace 将容器类型从我自己的类(继承自 boost::fusion::vector)更改为 boost::fusion::vector4,这破坏了我的流式重载器。

您可能会注意到,而不是 <string,space>我用 stringAndSpace 替换每个字符串.

拥有<string,space>会是最好的 - 但其他方式对我来说更容易。

总结一下:

typedef boost::mpl::replace< context, string, stringAndSpace >::type replacedContext;

转换我的容器类型——你能帮忙做一个函数,在编译时定义一个类型是下面的类吗

struct childrenListType : public  boost::fusion::vector<CHILDREN_TYPES...>

我输入的每个字符串之间有一个空格的模板参数?

我已将完整的源代码发布在:http://ideone.com/XxYTOt

他们的编译器 typeinfo 说没有 mpl 替换子类型是:16childrenListTypeIISsSsSsSsEE

和:N5boost6fusion7vector4I14stringAndSpaceS2_S2_S2_EE

您还可以看到流重载失败,因为它输出括号:

(this  sentence  needs  spaces )

最佳答案

对于 C++14,我在这里看不到 boost 的必要性——或者我可能遗漏了您的一个要求?以下将在普通 C++14 的类型之间添加空格:

struct space {};
template<typename, typename=void> struct spacer;

template<template<typename...> class T>
struct spacer<T<>> { using type = T<>; };

template<template<typename...> class T,typename T1, typename... Ts>
struct spacer<T<T1,Ts...>>
: spacer<T<T1,Ts...>, std::make_index_sequence<2*sizeof...(Ts)+1>> {};

template<template<typename...> class T,typename... Ts, std::size_t... Ns>
struct spacer<T<Ts...>, std::index_sequence<Ns...>>
{
using tuple = std::tuple<Ts...>;
using type =
T<std::conditional_t<(Ns%2)==0,std::tuple_element_t<Ns/2,tuple>,space>...>;
};

template<typename T> using spacer_t = typename spacer<T>::type;

Live example

上面保留了你的外部容器类型,所以在你的情况下,如果你传入 boost::fusion::vector<...> ,这也是您将获得的结果(只需额外的 space s)。

关于c++ - MPL替换而不类型转换聚变容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30685883/

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