gpt4 book ai didi

c++ - 是否有标准的静态函数包装器类型模板?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:39 24 4
gpt4 key购买 nike

我正在寻找一个标准的 C++14 类型模板,它静态地(在编译时)嵌入一个函数引用作为模板参数,并将 operator() 实现为对引用函数的转发调用.

我知道 std::function 存在,但它存储一个函数指针作为数据成员。我希望将函数引用嵌入到类型签名中,以便包装器类型为默认构造

我有一个有效的实现(带有示例用例):

#include <cstring>
#include <iostream>
#include <memory>

// Implementation:

template <typename Ret, typename... Args>
struct fn_t {
template <Ret (Func)(Args...)>
struct fn_ref {
Ret operator () (Args &&...args) const {
return Func(std::forward<Args>(args)...);
}
};
};

// Example use case:

template <typename T>
using unique_c_ptr = std::unique_ptr<T, fn_t<void, void *>::fn_ref<std::free>>;

int main() {
// { char *, void (*)(void *) } (16 bytes)
std::unique_ptr<char[], decltype(&std::free)> ptr1(::strdup("Hello"), &std::free);

// { char *, fn_t<void, void *>::fn_ref<std::free> } (8 bytes)
unique_c_ptr<char[]> ptr2(::strdup("Hello"));

std::cout << sizeof ptr1 << '\n' // 16
<< sizeof ptr2 << std::endl; // 8
return 0;
}

ptr1ptr2 工作相似,但 ptr2 的大小只有一半,因为它不需要存储指向 的指针std::free.

我的问题:是否有一种标准库方法可以做到这一点,这样我就不需要定义 fn_tfn_ref

最佳答案

std::integral_constant 可以完成这项工作:

 using CFree = std::integral_constant<void (*)(void*), std::free>;

因为它可能会转换为它的值,所以您可以使用相同的语法来调用 operator()

Demo

关于c++ - 是否有标准的静态函数包装器类型模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41316180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com