спецификация формата для параметров шаблона

У меня есть класс C ++, который основан на целочисленном типе; что-то вроде

template<typename int_type>
void myClass(int_type a) {
// [...]
}

Теперь я хотел бы прочитать данные из файла в переменные типа int_type с sscanf(), Для этого я должен указать формат из int_type, До сих пор я делал что-то вроде

if(sizeof(int) == sizeof(int_type))
sscanf(buffer, "%d %d", &i, &j);
else if(sizeof(long long) == sizeof(int_type))
sscanf(buffer, "%lld %lld", &i, &j);
else
assert(false);

но это не лучший способ справиться с ситуацией.

Любые другие предложения?

0

Решение

Вы можете использовать класс и специализацию:

template <typename T> struct scanf_format;

template <> struct scanf_format<int>
{
static constexpr const char* format = "%d";
static constexpr const char* format2 = "%d %d";
};

template <> struct scanf_format<long long>
{
static constexpr const char* format = "%lld";
static constexpr const char* format2 = "%lld %lld";
};

А потом использовать как

template <typename T>
void my_scanf(const char* buffer, T&a, T&b)
{
sscanf(buffer, scanf_format<T>::format2, &a, &b);
}

но более простой метод будет использовать operator >>

template <typename T>
void my_scanf2(const char* buffer, T&a, T&b)
{
std::stringstream ss(buffer);
ss >> a >> b;
}

Живой пример

1

Другие решения


По вопросам рекламы [email protected]