Вычесть класс держателя С++ «указатель на член» производного классаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Вычесть класс держателя С++ «указатель на член» производного класса

Сообщение Anonymous »

Я думаю, что этот вопрос связан с указателем C++ на член производного класса, но немного отличается.
У меня есть класс, который принимает указатель на член в качестве параметра шаблона и будет вычитайте тип держателя из указателя на член с помощью помощника, описанного в разделе Определение типа и класса при передаче указателя на элемент данных в качестве аргумента шаблона, не являющегося типом.
Если держатель производный класс, а член взят из базы 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?
Примечание: я могу изменить параметры шаблона LinkedList в template и в таком случае передайте правильный T вручную. Мне просто интересно, может ли помощник сделать это автоматически.
#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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»