Я пытаюсь создать шаблонный класс, который позволит функции сравнения возвращать целое число [0 - равно,> 0 a должно идти первым, <0 b должно идти первым]. </p>
Я используюСортировать структурирует параметры шаблона для отслеживания типа, который следует использовать, смещения поля в строке, а также порядка сохранения этого поля ... так что сравнение может соответственно вернуть правильное значение.
Предположим, что std::string
используется для представления сериализованного значения.
У меня проблемы с извлечением информации из шаблона.Я сохранил sort
в качестве параметра пакета, который будет иметь тип Sort
.Как мне получить доступ к этим параметрам в коде?Если есть лучший способ реорганизовать это.Я посмотрел на некоторые другие вопросы, связанные с шаблонами, но не увидел ни одного, который мог бы решить эту проблему.Я использую gcc 8.2 и c ++ 17.
#include <cstdint>
#include <string>
#include <cstring>
#include <cassert>
template<typename T, uint32_t offset, char Order = 'A'>
struct Sort {};
template<uint32_t keyLength, template<typename T,uint32_t offset, char Order> class ... sort>
class Comparator {
public:
int compare(std::string & a, std::string &b) {
assert(a.length()==b.length());
// How would I sum the sizeof each T. i.e. if T is int and another T is short, then sum should be 6+keyLength?
assert(a.length()==(sizeof(T)+keyLength)); // Check that my length is equal to key length + all type lengths put together
auto r = memcmp(a.data(),b.data(),keyLength);
if(r!=0) return r;
// How do I retrieve T,offset,Order of each pack parameter.
return internal_compare<T,offset,Order>(a.data(),b.data())? internal_compare<T,offset,Order>(a.data(),b.data()) : ...;
}
private:
template<typename IT,uint32_t iOffset, char iOrder>
int internal_compare(char * a,char *b) {
if constexpr (iOrder=='A'||iOrder=='a') {
return (*(static_cast<IT *>(a+iOffset)))-(*(static_cast<IT *>(b+iOffset)));
} else {
return (*(static_cast<IT *>(b+iOffset)))-(*(static_cast<IT *>(a+iOffset)));
}
}
};
Две вещи, которые мне не удалось выполнить.
- Каждый получает сумму sizeof (T) из сортировки.
- Вызовите внутренний оператор сравнения для каждой сортировки.
Ссылка на код в проводнике компилятора