- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
首先,让我从我正在尝试做的事情开始。我正在开发一个库,它可以更轻松地将 Python 解释器嵌入到 C++ 代码中,并且我想利用一些 C++11 功能。我大量使用 std::functions,这是一个问题,因为 Python 大量使用经典函数指针。
我一直在使用 fredbaba 的解决方案 https://stackoverflow.com/a/18422878
这可能不是一个好主意,但推理似乎是合理的;对于每个 std::function 你也想要一个指针,你需要创建一些带有调用感兴趣的 std::function 的静态函数的类或结构,并且任何类函数指针都可以指向静态函数。
但是,这意味着您必须确保创建的每个结构都是唯一的;该线程的发帖者使用唯一的整数作为标识符,这很麻烦。在我的代码中,我使用了 LINE 宏(COUNTER 似乎从来没有起作用),但是那当然迫使我将所有内容放在一个文件中以避免行号冲突。
我发现有人问过类似的问题,但没有一个真正做到;为了让它起作用,标识符必须是一个编译时间常量,我发现的许多解决方案在这方面都失败了。
这可能吗?我可以欺骗系统并获得指向我的 std::functions 的指针吗?如果您想知道为什么我需要...我采用了一个包装了一些 C++ 函数的 std::function,将其捕获在另一个函数中,然后将其存储在一个 std::list 中。然后我创建一个指向每个列表元素的函数指针,并将它们放入我创建的 Python 模块中。
// Store these where references are safe
using PyFunc = std::function<PyObject *(PyObject *, PyObject *)>;
std::list<PyFunc> lst_ExposedFuncs;
...
// Expose some R fn(Args...){ ... return R(); }
template <size_t idx, typename R, typename ... Args>
static void Register_Function(std::string methodName, std::function<R(Args...)> fn, std::string docs = "")
{
// Capture the function you'd like to expose in a PyFunc
PyFunc pFn = [fn](PyObject * s, PyObject * a)
{
// Convert the arguments to a std::tuple
std::tuple<Args...> tup;
convert(a, tup);
// Invoke the function with a tuple
R rVal = call<R>(fn, tup);
// Convert rVal to some PyObject and return
return alloc_pyobject(rVal);
};
// Use the unique idx here, where I'll need the function pointer
lst_ExposedFunctions.push_back(pFn);
PyCFunction fnPtr = get_fn_ptr<idx>(lst_ExposedFunctions.back());
}
从那时起,我实际上用 fnPtr 做了一些事情,但这并不重要。
这是疯了吗?我什至可以捕获这样的函数吗?
约翰
最佳答案
我为类似的用例做了一些大致相似的事情(实际上是一个用于 JNI 的类工厂)。我的技术是在 unsigned
上使用 template struct
并专门化为 0:每个 struct
都包含一个函数 - 您可以将其调整为static
指针对其有效的成员。我还展示了如何使用依赖于特定特化的参数调用函数 foo
(不确定您是否需要这个,但包括在内以防万一)。
extern bar* foo(const unsigned& id); // The function that gets called
template<unsigned N> struct Registrar
{
static bar* func()
{
return foo(N - 1);
}
private:
Registrar<N - 1> m_next; // Instantiate the next one.
};
template<> struct Registrar<0> // To block the recursion
{
};
namespace
{
Registrar</*ToDo - total number here*/> TheRegistrar;
}
TheRegistrar
几乎是一个元句法变量,它确保了给定数量的特化,因此创建了 static
函数。
(出于各种技术原因,我必须以相反的顺序实例化我的模板:如果您不需要,则可以相应地进行调整。)
我想这是 func
和 foo
之间的相互作用,您需要根据自己的需要进行调整。当然,每个 N
都是您要查找的编译时常量。
关于c++ - 没有 __LINE__ 或 __COUNTER__ 宏的唯一模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32846060/
如果我们使用 __COUNTER__在两个不同的源文件中,该值将重置为零。是否可以制作 __COUNTER__范围全局? 文件:file1.c int x=__COUNTER__; int y=__C
我看到这个问题: How to generate random variable names in C++ using macros? 回答如下:https://stackoverflow.com/a
我的电脑上安装了两个版本的 C++ 编译器。其中一个可以识别 __COUNTER__ 宏,而另一个则不能。在做了一些研究以使程序在两者中编译之后,我还没有遇到 __COUNTER__ 的宏定义。这是编
我正在做一些模板元编程,大部分只是编写我自己的编译时间列表,但我也有一些预处理器魔法,如果可能的话,我想用它来使事情变得更容易。 我想做的是创建仿函数的编译时列表。该部分已完成,但用于简化创建(并添加
我有一段代码使用 __COUNTER__ 宏来为变量生成唯一的名称。 此代码可移植吗?我知道 GCC 和 MSVS 支持它。其他编译器呢?宏是由标准定义的吗(据我所知,在 C++14 之前它不是)。
我正在尝试使用 __COUNTER__ 宏在我的代码中生成唯一的变量名。但是宏似乎不起作用。我可能以错误的方式使用它。请就我做错的地方向我提供指示或建议。 #define DUMB_MACRO() h
我想生成对编写单元测试用例有用的不同命名函数。我想这样做基本上是为了给每个单元测试用例赋予唯一的名称。 我正在使用 google 测试框架 编写单元测试用例。我必须使用 TEST_Macro 来编写单
我在玩预处理器和 c。尝试实现我自己的事件和层次结构系统。但是我遇到了一个问题。我正在尝试静态定义可以初始化的“模块”,以及一些预先静态定义的事件。对于我使用的事件,COUNTER 效果很好。但我不想
我想对 __COUNTER__ 进行字符串化并将其打印为字符串而不是整数,这可能吗? printf("%s\n", #__COUNTER__); 下面的方法我都试过了,还是不行 hello.c:6:1
我有一个执行类似于以下操作的宏: #define MAKE_VALS(...) \ int val1 = 0; \ int val2 = 0; \ : if(val1
我正在尝试编写一个宏,它将每个源文件仅扩展一次 __COUNTER__ 宏。我完全理解宏是如何处理它们的扩展的,但我在这个方面遇到了困难。我想在文件顶部扩展一次 __COUNTER__ 宏,然后对该定
我正在将一个项目从 Linux 迁移到 Xcode,我遇到了“版本”问题。 我在编译时需要一个唯一标识符来处理我的动态内容,在 linux 上我使用的是 __ COUNTER__ 预处理器,但似乎 X
是否可以在头文件的开头重置 __COUNTER__ 宏,使其在头文件中的计算在多个编译单元上保持一致? 最佳答案 枚举怎么样? enum { COUNTER_BASE = __COUNTER__ };
我目前在我的 C 库代码中使用 __COUNTER__ 宏来生成唯一的整数标识符。它运行良好,但我看到两个问题: 它不属于任何 C 或 C++ 标准。 也使用 __COUNTER__ 的独立代码可能会
__COUNTER__ 符号由 VC++ 提供和 GCC,每次使用都会给出一个递增的非负整数值。 我有兴趣了解是否有人使用过它,以及它是否值得标准化? 最佳答案 __COUNTER__ 在您需要唯一名
这个问题在这里已经有了答案: Does C++ support compile-time counters? (11 个答案) 关闭 6 年前。 我有一组 C++ 类,每个类都必须声明一个唯一的顺序
我需要在编译时在整个代码中生成一系列序列号。我以这样的方式尝试了“__COUNTER__”: void test1() { printf("test1(): Counter = %d\n", __
在this presentation 在 00:19:00 左右,Andrei Alexandrescu 解释了他的 SCOPE_EXIT 宏的实现。他在堆栈上创建了一个 ScopeGuard 对象,
我遇到以下关于 __COUNTER__ 的词: Care must be taken to ensure that __COUNTER__ is not expanded prior to inclu
首先,让我从我正在尝试做的事情开始。我正在开发一个库,它可以更轻松地将 Python 解释器嵌入到 C++ 代码中,并且我想利用一些 C++11 功能。我大量使用 std::functions,这是一
我是一名优秀的程序员,十分优秀!