Использование оператора new в качестве функтора / указателя на функцию - PullRequest
3 голосов
/ 10 февраля 2020

В C ++ 11, скажем, у меня есть функция, которая принимает функтор / функцию и передает аргументы этой функции. Я могу передать указатель на std::make_shared, который заставит его создать экземпляр класса и вызвать его конструктор. Но что эквивалентно делать это с необработанным operator new вместо этого? Кажется, мне следует использовать std::allocator, но функция construct требует указателя на выделенную память. Я могу заставить его работать, включив вызов new в функцию шаблона new_object, но, похоже, у меня должен быть способ напрямую получить указатель на эту функцию.

Это то, что у меня так далеко:

#include <iostream>
#include <memory>

struct foo
{
    foo(int i, const std::string& s)
    {
        std::cout << "i = " << i << " s = " << s << std::endl;
    }
};

template <typename F, typename... Args>
void do_something(F f, Args&&... args)
{
    f(std::forward<Args>(args)...);
}

// Is there a way to avoid this wrapper and handing a function pointer to
// something like ::new<foo, int, std::string> directly? Similar to std::make_shared<foo>?
template <typename C, typename... Args>
C* new_object(Args&&... args)
{
    return new C(std::forward<Args>(args)...);
}

int main()
{
    do_something(std::make_shared<foo, int, std::string>, 1, "test1"); // This works
    do_something(new_object<foo, int, std::string>, 12, "test2");
    return 0;
}

1 Ответ

0 голосов
/ 10 февраля 2020

Почему бы не что-то подобное?

   std::allocator<foo> alloc;
   do_something(std::bind(&std::allocator<foo>::construct<foo, int, std::string>, &alloc, alloc.allocate(sizeof(foo)), std::placeholders::_1, std::placeholders::_2), 12, "test2");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...