У меня есть функция типа malloc:
void * MyMalloc(size_t size) { return malloc(size); }
Теперь, чтобы использовать это, скажем, для типа char *;
char * charPointer = static_cast<char *>(MyMalloc(100));
Как избавиться от гипса?
Я могу сделать это:
template<typename T> T MyMalloc(size_t size) {return static_cast<T>(MyMalloc(size));}
И код вызова:
char * charPointer = MyMalloc<char *>(100);
Это выглядит лучше, но есть ли способ позволить компилятору сделать это за меня? Подобно auto, но я понимаю auto, что auto определяется типом возврата/назначения, а не потребностями вызывающего абонента.
Я хочу, чтобы вызывающий код выглядел так:
char * charPointer = MyMalloc(100);
Конечно, такой код не будет работать (и мне бы этого не хотелось):
int val = MyMalloc(100);
Я не уверен, что это можно сделать, но это возможно, я уверен, что кто-то здесь знает. Тай
Спасибо, я не совсем ясно выразился, от чего хочу избавиться, так это от <char *>
. Я отредактировал свой вопрос
Зачем вам это нужно в C++? new
уже делает это.
«Как избавиться от гипса?...» Не надо. Кастинг дает понять, что вы пытаетесь сделать.
Для этого вы можете использовать тип класса. Классы могут иметь оператор преобразования шаблона, который определит тип, в который вы хотите преобразовать, на основе выражения, в котором он используется. Это дает вам класс, который выглядит как
class MyMalloc
{
public:
MyMalloc(std::size_t size) : ptr(malloc(size)) {}
template <typename T>
operator T() { return static_cast<T>(ptr); }
private:
void* ptr;
};
и это позволяет вам использовать его как
int main()
{
char * charPointer = MyMalloc(100);
}
работу которого вы можете увидеть на этом живом примере.
Как компилятор определяет тип T
, который будет использоваться в шаблоне?
Замечательно, это именно то, что я искал!!! Спасибо! :Bow: Компилятор использует тип charPointer и применяет его к шаблону! :)
@MarkRansom Это обычная операция преобразования. Во время инициализации учитываются операторы преобразования MyAlloc
, и если у вас есть такой оператор преобразования шаблона, T
выводится как тип инициализатора.
Простой способ получить утечку памяти.
Спецификация @MarkRansom: timsong-cpp.github.io/cppwp/temp.deduct.conv
@Peter Я использую его в классе, который управляет указателем, поэтому утечки нет
auto charPointer = MyMalloc<char *>(100);
?