У меня есть класс, который принимает указатель на член в качестве параметра шаблона и будет вычитайте тип держателя из указателя на член с помощью помощника, описанного в разделе Определение типа и класса при передаче указателя на элемент данных в качестве аргумента шаблона, не являющегося типом.
Если держатель производный класс, а член взят из базы class, вычитаемый тип держателя — Base. Даже если я передам указатель на член в форме Derived::*. Код ниже представляет собой минимальный воспроизводимый пример, который также доступен по адресу https://godbolt.org/z/9rEc1876E
Я использую gcc с -std=c++20.
Мой вопрос:
- В помощнике TypeFromMember оба T = Base и T = Derived должны соответствовать спецификация шаблона. Как и почему компилятор решает сопоставить T = Base?
- Как я могу изменить реализацию TypeFromMember чтобы он мог правильно вычитать Derived вместо Base, когда я действительно передаю &Derived::node как ptr-to-member?
#include
struct Node{};
class Base
{
public:
Node node;
};
class Derived : public Base {};
// https://stackoverflow.com/questions/653 ... n-type-tem
template struct TypeFromMember;
template
struct TypeFromMember
{
using ClassType = T;
using MemberType = M;
};
template
class LinkedList
{
using T = typename TypeFromMember::ClassType;
public:
T *front()
{
return new T(); // just for verify the type
}
};
int main()
{
LinkedList bl;
LinkedList dl;
static_assert(std::is_same_v); // Pass
static_assert(std::is_same_v); // Pass
// static_assert(std::is_same_v); // Fail, decltype(dl.front()) is Base*
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... ived-class