将 std::function 包装在类中,函数名称为字符串
Wrap std::function in class with function name as string
我正在尝试将std::function
包装在一个类中,并将函数名称的可读string
添加到std::function
中。
我确实想出了这个简单的课程(在标题.hpp中定义(
template <typename... Args>
class CExtended_Function
{
public:
explicit CExtended_Function(
const std::function<void(Args...)>& func_type, const std::string& func_name)
: func(func_type)
, function_name(func_name)
{
}
/// Function
const std::function<void(Args...)> func;
/// Function Name
const std::string function_name;
};
我自己的 make 函数看起来像这样。想法是将函数名称作为模板参数传递给 make 函数。make 函数应该创建一个std::function
实例和一个std::string
实例。
(在标题.hpp中定义(
template <typename Func_T, typename... Args>
CExtended_Function<Args...> Make_Extended_Function()
{
std::function<void(Args...)> func(Func_T);
std::string func_name(NCommonFunctions::type_name<Func_T>());
CExtended_Function<Args...> res(func, func_name);
return res;
}
其中type_name<My_Function>()
返回函数的名称为 std::string_view
在 header.hpp 中定义
template <class T>
constexpr std::string_view type_name();
但是当像这样使用我的 make 函数时
在源中使用.cpp
static void Test_Callback();
auto test = Make_Extended_Function<Test_Callback>();
我收到错误:
无法解析符号"Make_Extended_Function">
你能给我一个提示为什么我会收到这个错误吗?
您可能需要
在代码中更改一些内容:
- Test_Callback函数,
- 则只能将函数指针作为非类型模板参数传递。 即它应该被
auto test = Make_Extended_Function<&Test_Callback>();
; - 如果要将函数指针作为模板参数传递,则语法
template<function+pointer_type function pointer>
(类似于模板(,因此应该make_extended_function改为template <auto Func_T, typename... Args> CExtended_Function<Args...> Make_Extended_Function()
(我在这里使用"auto"以使事情变得更容易(。type_name(( 也是如此
示例代码:
#include <iostream>
#include <functional>
#include <string_view>
using namespace std;
namespace NCommonFunctions {
template <auto T>
std::string type_name() { return "a_name"; }
}
template <typename... Args>
class CExtended_Function
{
public:
explicit CExtended_Function(
const std::function<void(Args...)>& func_type, const std::string& func_name)
: func(func_type)
, function_name(func_name)
{
}
/// Function
const std::function<void(Args...)> func;
/// Function Name
const std::string function_name;
};
template <auto Func_T, typename... Args>
CExtended_Function<Args...> Make_Extended_Function()
{
std::function<void(Args...)> func(Func_T);
std::string func_name(NCommonFunctions::type_name<Func_T>());
CExtended_Function<Args...> res(func, func_name);
return res;
}
void Test_Callback() { cout << "test" << endl; }
int main () {
auto test = Make_Extended_Function<&Test_Callback>();
test.func();
}
Make_Extended_Function
需要类型。 您提供函数指针,因此出现错误。
更简单的解决方法可能是将Make_Extended_Function
更改为:
template <typename... Args>
CExtended_Function<Args...>
Make_Extended_Function(const std::function<void(Args...)>& f, const std::string& name)
{
return CExtended_Function<Args...>(f, name);
}
(但你必须用std::function
来调用它才能允许扣除(。
NCommonFunctions::type_name
似乎有与Make_Extended_Function
相同的问题。
一个可能更好的解决方法是删除 std::function 并直接获取函子:
template <typename F>
class CExtended_Function
{
public:
explicit CExtended_Function(
const F& f, const std::string& name)
: f(f)
, name(name)
{
}
F f;
std::string name;
};
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何从void函数输出字符串
- 使用用户定义函数的字符串反转
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 在c++构造函数中使用随机字符串生成器
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- C++:如何使函数只返回作为列表一部分的字符串
- 如何在C++中的同一函数中使用字符串和双精度
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 对函数 PlaySound 使用字符串变量
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 构造函数字符串参数未设置窗口标题
- C++默认构造函数:字符串参数与字符串参数()
- 使用函数C++字符串输入
- c++模板函数字符串类型不匹配