2014-09-22 3 views
2

Я уверен, что решение следующей проблемы довольно стандартное, но я не мог найти правильные условия для его поиска. У меня есть два класса, скажем, SomeB<A> и SomeA<B>. Я хочу создать экземпляр SomeB<A>, где A:=SomeA<B> и B:=SomeB<A>. (Упрощенно) код выглядит следующим образом:C++ простой шаблон рекурсии

template<typename A> 
class SomeB 
{ 
    A getA() { /* ... */ } 
}; 

template<typename B> 
class SomeA 
{ 
    B getB() { /* ... */ } 
}; 

int main(int argc, char **argv) 
{ 
    SomeA<SomeB<SomeA<SomeB<...> > > > test; 
    //      /\ 
    //      | 
    //      +---- recursion 
    test.getB(); 
    return 0; 
} 

Теперь, как не мне сказать компилятору, что там нет «сюрпризов», как в SomeA<SomeB<SomeA<SomeB<Suprise_AnotherA<...>>>>>?

+1

Ваша концепция не имеет смысла. – CashCow

+0

@CashCow: Какая концепция? – Deduplicator

+0

Извините, но в C++ нельзя определить типы рекурсивных рекурсивных типов. – Deduplicator

ответ

1

Благодаря Vittorio Romeo для указания параметров шаблона шаблона. Это один компилируется и работает:

template<template<typename> class A> 
class SomeB 
{ 
public: 
    A<SomeB> getA() { return A<SomeB>(); } 
}; 

template<typename B> 
class SomeA 
{ 
public: 
    B getB() { return B(); } 
}; 

int main(int argc, char **argv) 
{ 
    SomeB<SomeA> test; 
    test.getA(); 
    return 0; 
} 

Мета информация для тех, кому любопытно: SomeB дерева (узел) класс и SomeA это класс, который находит конкретный ребенок узла в дереве. SomeA может быть реализован различными способами и может использовать собственную структуру данных для хранения детей, то есть экземпляров SomeB, для эффективной фильтрации.

+1

Прошу прощения, но я не похожа на то, что вы описали в вопросе. Я имею в виду 'SomeA' в тесте' SomeB ; 'является шаблоном. Это не тип 'SomeA ', как вы намеревались. – Kostya

+0

@ Kostya: Touché! Я уверен, что это решает мою проблему. Если бы я знал параметры шаблона шаблона, я бы задал вопрос по-другому. Я уверен, что есть xkcd об этом ... – conner82

0

Позволяет изменить довольно неуклюжую нотацию C++ на более теоретическую (иш) модель, чтобы мы могли четко определить, что вы хотите.

template<typename A> class SomeB { ... }; 

На самом деле означает, что у вас есть штуковина под названием SomeB, который принимает в простом виде и возвращает другой простой тип:

SomeB : typename -> typename 

И, например, если у вас есть «шаблон параметр шаблона» вещь как то:

template<template<typename> class A> class SomeB { ... }; 

тогда что бы перевести так:

SomeB : (typename -> typename) -> typename 

Теперь вот как я понял, чего вы хотите. Вы говорите, что «у меня есть эти два парня здесь»

SomeA : typename -> typename 
SomeB : typename -> typename 

"Если бы я хотел применить как SomeA<SomeB>, что бы быть незаконным, так как SomeB не typename. - это typename->typename Если только я мог применить что SomeB к чему-то, чтобы получить простой тип ...

о Как насчет я применяю его как SomeB<SomeA> нет, это было бы незаконным, поскольку SomeB не typename -? это typename->typename , Если бы я мог применить это SomeA к чему-то, чтобы получить простой тип ...

Oh! Как насчет того, чтобы применить его как SomeA<SomeB>? Нет, это было бы незаконным с SomeA не является typename - это typename->typename. Если бы я мог применить это SomeB к чему-то, чтобы получить простой тип ...

Oh! Как насчет того, чтобы применить его как SomeB<SomeA>? Нет, это было бы незаконным с SomeA не является typename - это typename->typename. Если бы я мог применить этот код SomeB к чему-то, чтобы получить простой тип ... "

И так далее - У вас есть идея, и это очень похоже на все классические логические парадоксы, как the liar paradox Более формально, то, что вы хотите сделать, это называется impredicative definition

И угадайте что...? Type theory was invented от Bertrand Russel, чтобы уничтожить непроизводительность.

Таким образом, ваше намерение заключается не только в конфликте с возможностью выразить себя с использованием C++, но и в противоречии с основными идеями теории типов. И, на мой взгляд, Не имеет никакого смысла. Как парадокс лжеца.

Смежные вопросы