Вложенный шаблон класса variadi c - PullRequest
0 голосов
/ 01 апреля 2020

Извините за запутанный заголовок ... Я хотел бы сделать следующее:

template<typename T, typename... Ts>
struct Foo {
    ??? template<bool Bool> friend Foo<Ts...>::Bar<Bool> ???
private:
    Foo() {}
public:
    template<bool Bool>
    struct Bar {
        Foo<Ts...> foo(){return Foo<Ts...>{};}
    };
};

Так что, например, Foo<int, int> можно построить только из Foo<T, int, int>::Bar<Bool> для любого T и Bool.

Я пытался использовать псевдонимы шаблонов, этот, который выглядел ближе всего к работе:

    template<typename R, bool Bool>
    using parent_bar = typename Foo<R, T, Ts...>::template Bar<Bool>;
    template<typename R, bool Bool>
    friend class parent_bar;

Кажется, что это невозможно вообще, я просто хотел бы подтверди это. Хотя Бьярне Страуструп утверждает, что на вершине р. 684 из C ++ Language, 4-е издание, что «сложная модель дружбы почти наверняка является ошибкой проектирования», у меня есть очень хороший пример для использования этого.

...