Получение типа «this» в C ++ при определении нестатического члена - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь сделать что-то необычное из шаблона, и наткнулся на проблему: я хотел бы получить тип класса внутри его определения при определении нестатического члена.Это возможно?(В любой версии C ++.)


Возьмите следующий код:

template<typename T>
struct inner {
    T* this_;
    /* fancy stuff... */
};

struct foo {
    inner<foo> bar{this};
};

Класс foo имеет нестатический член bar, который инициализируется указателемfoo* this.Этот код компилируется в clang и gcc.

Но на самом деле я хочу, чтобы определение inner появилось в макросе, что означает, что у меня нет строки foo для использования в строке inner<foo> bar{this},Попытка использовать:

inner bar{this};

в C ++ 17, которая позволяет выводить аргументы шаблона для шаблонов классов, выдает ошибку

error: использованиешаблон класса 'inner' требует аргументов шаблона;в нестатическом элементе структуры inner bar{this};

недопустим вывод аргументов, который я понимаю.Попытка:

inner<decltype(*this)> bar{this};

выдает похожую ошибку:

ошибка: недопустимое использование 'this' вне нестатической функции-члена inner<decltype(*this)> bar{this};


В качестве обходного пути я использовал следующий любопытно повторяющийся шаблон:

template<typename T>
struct SelfAwareType {
    using myOwnType = T;
}

struct foo : SelfAwareType<foo> {
    inner<myOwnType> bar{this};
};

1 Ответ

0 голосов
/ 28 мая 2018

Если вы можете ограничить все foo требованием typedef 'this_type', тогда ваш макрос может не нуждаться в указании foo.

template<typename T>
struct inner {
    T* this_;
    /* fancy stuff... */
};

struct foo {
    typedef foo this_type ;
    inner<this_type> bar{this};
};

, что в основном совпадает с вашим «обходным путем» без использования crtp и введения другого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...