Хранение нешаблонных частей шаблонного класса в cpp

Я давно задавался этим вопросом, у stackoverflow было множество связанных, но не совсем одинаковых вопросов, поэтому я задаю их здесь.

Возможно ли, чтобы шаблонный класс имел в cpp методы, не зависящие от этого шаблона? Очевидно, что эти методы не зависят от шаблона, поэтому компилятор должен иметь возможность скомпилировать их отдельно.

Если это невозможно, то какой обходной путь, если я действительно хочу В самом деле разделить этот код?

template<typename T>
class MyAwesomeVectorClone{
  size_t size;
  size_t capacity;
  T* data;

  bool doesSizeExceedCapacity(); // non template method, define in cpp?
  void add(T& t){// template method
  }
}
bool MyAwesomeVectorClone::doesSizeExceedCapacity() {
  return size > capacity;
}

Поместить не шаблонные части в (не шаблонный) базовый класс и наследовать от него в частном порядке?

Borgleader 08.04.2019 20:13

Не уверен, что вы подразумеваете под compiled separately, но да, вы можете поместить их в исходный файл, хотя вам все еще нужен параметр шаблона в сигнатуре функции: template <class T> bool MyAwesomeVectorClone<T>::doesSizeExceedCapacity() { return size > capacity; }

Mansoor 08.04.2019 20:14

@Borgleader Это решение сработает, если нет ничего чище, я буду использовать это

lennartVH01 08.04.2019 20:16

@Mansoor Заметит ли компилятор, что он не использует T, а затем разрешит это? я попробую

lennartVH01 08.04.2019 20:17

@ lennartVH01 lennartVH01 независимо от того, используется ли параметр, не имеет значения, параметр шаблона необходим для правильного определения функции-члена.

Mansoor 09.04.2019 17:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
110
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Is it possible for a templated class to have methods in the cpp that do not depend on this template?

Нет. Шаблон класса не является конкретным типом, вы создаете тип, которому эти функции-члены могут принадлежать только при создании экземпляра шаблона. Поэтому невозможно обращаться с функциями-членами, которые не зависят от параметра типа шаблона, иначе, чем с остальной частью шаблона класса.

Однако вы можете выделить части, независимые от параметров, в отдельный класс или отдельные бесплатные функции. Это тема статьи 44 книги «Эффективный C++» Скотта Мейерса («Выделение независимого от параметров кода из шаблонов»). Он представляет матричный пример, в котором независимый от параметров код перемещается в базовый класс, от которого в частном порядке наследуется фактический шаблон класса. Но состав, конечно, тоже хорош.

Другим решением является добавление функции и любых других вспомогательных функций в пространство имен, которое ясно указывает, что оно содержит функции, полезные для реализации шаблона класса.

namespace MyAwesomeVectorClone_Impl_Details
{
   bool doesSizeExceedCapacity();
}

Эти функции могут быть определены в файле .cpp.

Но вы не можете получить доступ к частному состоянию объекта, делая это

lennartVH01 08.04.2019 20:23

@ lennartVH01, правда. В этом случае вам нужно передать в функцию необходимые параметры.

R Sahu 08.04.2019 20:24

Другие вопросы по теме