Использование template в C++

204
17 декабря 2019, 04:50

Всех приветствую. Пытаюсь понять как использовать template в С++.

Как я понял, удобство template состоит в том, что можно использовать его как-то так:

Вместо создания 3-х методов чтения float, int, byte из файла :

void ReadFloat(){
}
void ReadInt(){
}
void ReadByte(){
}

Можно использовать что-то типа такого:

template<typename T>
T Read(){
 T s;
 file.Read(s, sizeof(T));
 return s;
}

Но в примерах я встречаю лишь вот такое:

template <class T>
class MyTemplate
{
public:
  void dump();
  T t;
};

template <class T>
void MyTemplate<T>::dump()
{
  cerr << t << endl;
}

И использование:

MyTemplate<float> m_t;
m_t.dump();

Но тут мне непонятно 2 вещи:

Получается, что для каждого типа данных мне нужно создавать новые объекты?

А если, к примеру, из всего класса мне нужно использовать template лишь к 1 методу, а не ко всему классу?

Я попробовал так:

class FILE_READER{
public:
    bool just_something();
    template <class T>
    T Read();
    template <class T>
    void Write(T value);
};
template<class T>
T FILE_READER::Read() {
    T value;
             // куда записывать
    ReadFile(T, sizeof(T));
    return value;
}
template<class T>
void FILE_READER::Write(T value)
{
    WriteFile(T, sizeof(T));
}
// БЕЗ template
bool FILE_READER::just_something(){
  // do something...
}

Как можно это реализовать правильно?

UPD: Как я прочитал в ответах, у всех прекрасно компилируется.

У меня же выдает такую ошибку:

LNK2019 unresolved external symbol "public: void __thiscall FILE_READER::Write(void)" (??$Write@H@F@@QAEXXZ) referenced in function _main TM D:\C++ Projects\TM\TM\TM.obj 1

UPD_2:

Я попробовал вставить весь этот код в 1 файл (header):

class FILE_READER{
public:
    bool just_something();
    template <class T>
    T Read();
    template <class T>
    void Write(T value);
};
template<class T>
T FILE_READER::Read() {
    T value;
             // куда записывать
    ReadFile(T, sizeof(T));
    return value;
}
template<class T>
void FILE_READER::Write(T value)
{
    WriteFile(T, sizeof(T));
}
// БЕЗ template
bool FILE_READER::just_something(){
  // do something...
} 
  • все заработало.

Тут же начинаю разбрасывать по cpp и h файлам - выдается верхняя ошибка.

test.cpp:

#include "pch.h"
#include "Test.h"
template<class T>
T FILE_READER::Read() {
    T value;
    // куда записывать
    cout << sizeof(T) << endl;
    return value;
}
template<class T>
void FILE_READER::Write(T value)
{
    cout << sizeof(T) << endl;
}
// БЕЗ template
bool FILE_READER::just_something() {
    // do something...
    return true;
}

test.h:

#pragma once
#include <iostream>
using namespace std;
class FILE_READER {
public:
    bool just_something();
    template <class T>
    T Read();
    template <class T>
    void Write(T value);
};
Answer 1

Можно использовать что-то типа такого:

template<typename T>
T Read(){
 T s;
 file.Read(s, sizeof(T));
 return s;
}

Так используйте, почему нет.

Но в примерах я встречаю лишь вот такое: [шаблон класса]

Значит, мало примеров посмотрели. Бывают шаблоны функций (как у вас), бывают шаблоны классов (как в ваших примерах). Даже шаблоны переменных бывают.

MyTemplate<float> m_t;
m_t.dump();

Получается, что для каждого типа данных мне нужно создавать новые объекты?

Да. Но их иожно делать временными!

MyTemplate<float>{}.dump();

А если, к примеру, из всего класса мне нужно использовать template лишь к 1 методу, а не ко всему классу?

Я попробовал так: [код]

Все правильно пробовали. У меня этот код компилируется.

UPD_2:

Я попробовал вставить весь этот код в 1 файл (header) - все заработало.

Тут же начинаю разбрасывать по cpp и h файлам - выдается

LNK2019 unresolved external symbol "public: void __thiscall FILE_READER::Write(void)" (??$Write@H@F@@QAEXXZ) referenced in function _main TM D:\C++ Projects\TM\TM\TM.obj 1

Ну это классика. Определения шаблонов должны быть в хедерах (кроме особых случаев).

Раз: Разделение класса в заголовочный файл и в файл с кодом

Два: Не работает обьявление шаблона класса в заголовочном файле с определением методов в отдельном файле реализации

И так далее.

READ ALSO
В переменную записывается символ, а не строка

В переменную записывается символ, а не строка

ситуация следующая, в файле находится 3 словаii - переменная содержащая число 3 (good переменная типа fstream(если важно)), goods - string

177
typedef для функции

typedef для функции

Хочу создать ссылку на функцию так как очень длинная цепочка вызова каждый раз

225
thread detach - закрывается окно

thread detach - закрывается окно

Вопрос странный конечно, но почему-то закрывается окно, созданное с detach после закрытия приложения которое его создалоЧто-то с сигналами?

185
Как установить LLVM_ROOT для emscripten?

Как установить LLVM_ROOT для emscripten?

У меня Linux UbuntuУстановил emsdk

217