У меня есть этот классMPL заменить без литья слитого контейнера
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, чтобы получить доступ к его переменным детям члена.
Тип childListType - это класс, который наследуется от boost :: fusion :: vector.
Я хотел бы программным образом сделать переменную-члену children содержать один пробел между каждой строкой.
Так что, если я вхожу:
<string,string>
детей становится:
<string, space,string>
Если я вхожу:
<string,string,string>
становится
<string,space,string,space,string>
т.д.
Я использую повысить фьюжн поэтому должны быть во время компиляции.
Я попытался сделать это следующим образом:
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: заменить изменяет тип контейнера из моего собственного класса, который наследуется от повышающего :: фьюжн :: вектор, к 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)
Не понимайте, почему бы просто не добавить пробелы в точке, где вы вытесняете все - если вы знаете, что каждый элемент должен быть разделен пробелом? Также я предполагаю, что ваша потоковая функциональность сломана, если вы не можете обрабатывать * кортежи * разных размеров? – Nim
Код, который я вставил здесь, должен только показать концепцию, которую я хочу решить. –
На самом деле не просто получить его, чтобы вывести правильную вещь - я начинаю изучать MPL и застрял здесь, поэтому я надеялся, что кто-то может сказать что-то вроде «о, вам просто нужно использовать boost :: XXXXX вместо» или показать меня в правильном направлении. –