我有一个使用pimpl成语的界面,但界面需要是可重入的.但是,调用线程不需要知道锁定.这四点部分的问题,一部分无偿做作C++ 11例(例如包括解决,我已经跨越再运行几个常见问题,这样的问题:locking,pimpl,rvalue这里的答案在他们的品质是有些暧昧和C++ 11) .
在标题中,example.hpp:
#ifndef EXAMPLE_HPP
#define EXAMPLE_HPP
#include <memory>
#include <string>
#ifndef BOOST_THREAD_SHARED_MUTEX_HPP
# include <boost/thread/shared_mutex.hpp>
#endif
namespace stackoverflow {
class Example final {
public:
typedef ::boost::shared_mutex shared_mtx_t;
typedef ::boost::shared_lock< shared_mtx_t > shared_lock_t;
typedef ::boost::unique_lock< shared_mtx_t > unique_lock_t;
Example();
Example(const std::string& initial_foo);
~Example();
Example(const Example&) = delete; // Prevent copying
Example& operator=(const Example&) = delete; // Prevent assignment
// Example getter method that supports rvalues
std::string foo() const;
// Example …Run Code Online (Sandbox Code Playgroud) 在以下示例中,将userdata创建一个类型的值,MyType并使用__tostring调用的元函数创建一个表LI_MyType__tostring.该代码创建了一个基于闭包的lua OOP.我对提供的示例的抱怨似乎只有一种方法可以userdata通过upvalues与方法调用相关联.除非我想跨实例共享相同的元表,否则这本身并不成问题.
在一个理想的世界 - 以及我希望用这个问题发掘的东西 - 有没有办法将upvalue与值(例如userdata)相关联,而不通过upvalue将它与函数调用相关联?我希望有一个技巧可以让我继续使用基于闭包的lua OOP 并在实例之间共享相同的元数据.我不乐观,但我想我会问是否有人有建议或不明显的伎俩.
using FuncArray = std::vector<const ::luaL_Reg>;
static const FuncArray funcs = {
{ "__tostring", LI_MyType__tostring },
};
int LC_MyType_newInstance(lua_State* L) {
auto userdata = static_cast<MyType*>(lua_newuserdata(L, sizeof(MyType)));
new(userdata) MyType();
// Create the metatable
lua_createtable(L, 0, funcs.size()); // |userdata|table|
lua_pushvalue(L, -2); // |userdata|table|userdata|
luaL_setfuncs(L, funcs.data(), 1); // |userdata|table|
lua_setmetatable(L, -2); // |userdata|
return 1;
}
int LI_MyType__tostring(lua_State* L) {
// NOTE: …Run Code Online (Sandbox Code Playgroud) 如何创建仅暴露其属性而不是其方法的Lua对象?例如:
local obj = {
attr1 = 1,
attr2 = 2,
print = function(...)
print("obj print: ", ...)
end,
}
Run Code Online (Sandbox Code Playgroud)
生产:
> for k,v in pairs(obj) do print(k, v) end
attr1 1
attr2 2
print function: 0x7ffe1240a310
Run Code Online (Sandbox Code Playgroud)
另外,是否可以在Lua中不使用OOP的冒号语法?我不需要继承,多态,只需要封装和隐私.
我需要开发一个Windows/Linux命令行实用程序.该实用程序将与在两个平台上都具有标准API的中间件进行通信.我以前在FreeBSD/Linux上做过一些跨平台开发,这样做要容易得多 - 而且我的团队中有人可以与我交谈.
在这一点上,我的小组中没有人处理过Windows/Linux开发项目.我正在寻找有关如何最好地设置它的建议.我也是C++的新手,我主要开发了C#/ .Net GUI应用程序和Linux设备驱动程序级别的"东西".有点奇怪的混合.
我认为最好定义我自己的数据类型而不是使用Linux或Windows定义的类型 - 将操作系统特定代码保存在单独的文件夹中并有条件地包含.这就是我们为Linux/BSD工作所做的一切.所以这似乎是一个良好的开端.
这里的开发人员之一是Boost的忠实粉丝...另一个想法是TCLAP命令行解析器库更容易使用......显然一切都必须与许可兼容.
代码将是开源的,但它是生产代码 - 所以我不想马虎.我还应该做什么或寻找什么?那里有最好的做法吗?