使用 operator new 作为 functor/function 指针
Using operator new as a functor/function pointer
在 C++11 中,假设我有一个接受 functor/function 的函数并将参数转发给该函数。我可以传入一个指向 std::make_shared
的指针,这会导致它实例化一个 class 并调用它的构造函数。但是,用原始的 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;
}
为什么不是这样的?
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");
在 C++11 中,假设我有一个接受 functor/function 的函数并将参数转发给该函数。我可以传入一个指向 std::make_shared
的指针,这会导致它实例化一个 class 并调用它的构造函数。但是,用原始的 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;
}
为什么不是这样的?
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");