我正在研究一个事件库,我遇到了Variadic模板的问题.
一切都工作得非常好,除了我不能将参考作为参数传递...
这是一个非常简化的例子,用来揭露我的问题.
struct DelayedSignal
{
~DelayedSignal ()
{ std::cout << "~DelayedSignal CLOSE" << std::endl; }
template<class C, class... Args>
DelayedSignal ( void(C::*func)(Args...), C& obj )
{ std::cout << "DelayedSignal INIT - 03 - pointer to method & pointer to class instance (Arg num: " << sizeof...(Args) << ")" << std::endl; }
template<class C, class... Args>
DelayedSignal ( void(C::*func)(Args...), C& obj, Args... args )
{
std::cout << "DelayedSignal INIT - 04 - pointer to method & pointer to class instance …Run Code Online (Sandbox Code Playgroud) 我正在尝试检查存储在数据库中的某些 URL 是否仍然是有效链接。为了实现这一点,我使用 httplib2 来请求 HEAD 状态,以避免下载页面的全部内容。我对结果非常满意。
但后来我发现在某些情况下,使用 HEAD 请求返回的状态代码与使用 GET 请求返回的状态代码并不相似。
因此,为了防止库中出现错误,我使用不同的库进行了一些测试(下面是我的“请求”库测试):
> import requests
> rg = requests.get("https://fr.news.yahoo.com/chemin-dames-l-hommage-personnel-pr%C3%A9sident-121005844.html")
> rh = requests.head("https://fr.news.yahoo.com/chemin-dames-l-hommage-personnel-pr%C3%A9sident-121005844.html")
> print("GET status code:", rg.status_code)
('GET status code:', 200)
> print("HEAD status code:", rh.status_code)
('HEAD status code:', 404)
Run Code Online (Sandbox Code Playgroud)
但无论我使用什么库,对于同一个 URL,我仍然有不同的 GET & HEAD 状态。
因此,显然站点维护者决定不为 HEAD 和 GET 请求返回相同的状态代码......即使不推荐,这似乎也是合法的。
有没有一种方法可以避免此问题,并且仍然知道链接是否有效,而无需下载我需要验证的近 200 万个网址的全部内容?
每当 HEAD 请求返回 >400 状态代码时,我都可以仔细检查 GET 请求,但这对我来说似乎是一项肮脏的工作。
在Lua 5.2手册中我们可以找到以下文字:
当创建一个 C 函数时,可以将一些值与其关联,从而创建一个 C 闭包(参见 lua_pushcclosure);这些值称为 upvalues,并且无论何时调用该函数都可以访问该函数。
每当调用 C 函数时,其上值都位于特定的伪索引处。这些伪索引是由宏 lua_upvalueindex 生成的。与函数关联的第一个值位于 lua_upvalueindex(1) 位置,依此类推。对 lua_upvalueindex(n) 的任何访问(其中 n 大于当前函数的 upvalue 数量(但不大于 256))都会产生可接受的(但无效)索引。
因此,我创建了一个与使用“new”创建的对象指针关联的回调函数。
lua_pushstring(L,"myCallbackFunc");
Foo* ideleg = new Foo()
lua_pushlightuserdata (L, (Foo*)ideleg);
lua_pushcclosure(L, LuaCall<Tr,C,Args...>::LuaCallback,1);
lua_settable(L,-3);
Run Code Online (Sandbox Code Playgroud)
所有的机制都工作得很好......但现在是时候清理了,当我取消注册回调函数或退出程序时,我无法取回指针,因此我可以删除它。
我确实使用以下代码片段找到了表条目:
lua_pushnil(L);
while (lua_next(L, -2) != 0)
{
if (lua_isstring(L, -2) && lua_tostring(L,-2) == "myCallBackFunc" )
{
// get the pointer back and delete it!
}
}
Run Code Online (Sandbox Code Playgroud)
(我可以使用 来做到这一点吗lua_getfield(L, -1, "myCallBackFunc");?)
但我无法获得与函数外部的闭包相关的上值LuaCall<Tr,C,Args...>::LuaCallback()(实际上在这个关闭函数内部我可以简单地使用lua_upvalueindex(1),但在这种情况下我在关闭函数之外......)
有没有办法获取这个值,以便我可以在不再需要指针时删除它?
编辑:我确实找到了lua_getupvalue …
我试图找到一种方法来获取模板参数的基类.
考虑以下课程:
template <class C>
class Foo
{
public:
Foo(){};
~Foo(){};
C* ptr;
};
Run Code Online (Sandbox Code Playgroud)
如果C是参考(例如Test&)那么ptr是C&*
但我需要得到一个指针基类,无论C是引用,指针还是其他任何东西.
反正有没有获得C的"基础"类,所以我可以创建我需要的指针?
我肯定需要一些帮助解决这个问题.我试图解决这个问题,因为5天后我尝试了几乎每一个我能在互联网上找到的想法,我都疯了......
当我用Cmake生成的makefile编译我的C++项目时代码编译高达100%,但后来无法链接OGRE框架并退出错误1.
由于我无法使用自己的项目进行编译,并且作为我的程序无法找到的框架是OGRE框架,我尝试使用Ogre3D设置教程提供的文件来简化问题,使其最大化.但问题和错误仍然完全相同,编译过程停止:
ld:框架未找到 OGRE
我试图复制Ogre.framework中发现的OgreSDK/lib目录/释放系统的默认/库/框架和几乎无处不在这台计算机,包括项目文件夹(与上OgreFindFrameWork.cmake文件修改)上,特别是所有的文件夹由OgreFindFrameWork.cmake文件定位,但此错误仍在此处.
我也尝试了很多Cmake修改或使用Xcode进行编译,但由于它总是以相同的错误消息完成,我决定使用最简单的一个来说明这个问题.因此,以下信息是上面指出的OGRETutorialFramework调试项目的相关信息.
有没有人可以解释我需要改变什么使链接器能够找到一个定义的框架(我想这不是特定于Ogre框架的问题,我可能会与另一个框架有相同的错误)?
谢谢.
以下部分的索引:
- 1/make log
- 2/OGRETutorialFramework的CMakeFile.txt
- 3 /使用的软件版本
- 1/make生成和构建日志
以下是生成过程的日志:
Valkeas-Mac:OGRETutorialFramework root# make
-- Checking whether C compiler has -isysroot - yes
-- Checking whether C compiler supports OSX deployment target flag - yes
-- Checking whether CXX compiler has -isysroot - yes
-- Checking whether CXX compiler supports OSX deployment target flag - yes
-- Detected …Run Code Online (Sandbox Code Playgroud)