Задать вопрос
@tugo

C++ шаблоны — можно ли генерировать разный код в зависимости от размера передаваемого типа?

Зачем это надо.
Хочу написать свою C++ обертку над средствами передачи данных между потоками RTOS.
Есть несколько средств обмена данными:
1. Queue https://developer.mbed.org/handbook/RTOS#queue
Позволяет передать данные размером 4 байта. Внутри класса Queue данные приводятся к типу uint32_t.
2. Комбинация Queue и MemoryPool. https://developer.mbed.org/handbook/RTOS#memorypool
В queue передаем указатель на данные, в MemoryPool сами данные.

Синтаксис помещения и извлечения данных отличается.
Хочу создать общий класс GenericQueue, в который можно помещать данные любого размера (тип данных определяется на этапе компиляции). Если помещаются данных 4 байта - генерится более простой код с Queue. Если данные больше - генерится код с Queue + MemoryPool.

GenericQueue<float, 10> floatQueue;
GenericQueue<double, 5> dobleQueue;
GenericQueue<SomeStruct, 5> structQueue;


Как это сделать?
  • Вопрос задан
  • 440 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@MiiNiPaa
Как-то так:
#include <iostream>
#include <type_traits>
#include <typeinfo>

template <typename T>
class GenericQueueBase
{
	//Общий интерфейс очереди (для рантайм полиморфизма)
};

template <typename T>
class Queue_pass : public GenericQueueBase<T>
{
    static_assert(sizeof(T) <= 4, "types up to 4 bytes are allowed");
    //Реализация очереди
};

template <typename T>
class Pool_pass : public GenericQueueBase<T>
{
    //Реализация пула
};


template<typename T>
using GenericQueue = typename std::conditional<sizeof(T) <= 4, Queue_pass<T>, Pool_pass<T>>::type;

int main()
{
	std::cout << typeid(GenericQueue<int>).name() << '\n' << typeid(GenericQueue<double>).name();
}
Ответ написан
Комментировать
maaGames
@maaGames
Погроммирую программы
Не стоит привязываться к размеру, стоит привязываться к типу.
Но и к размеру тоже можно, если преобразовать размер в тип:

template< int SZ >
struct SizeType
{
enum { TypeSize = SZ };
};

SizeType и SizeType - разные типы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы