我一直迷恋于基于组件的编程(无论是COM,另一个系统,还是只使用普通C++中的范例).它需要一点习惯,如果一个人习惯于"传统的"OOP模型,但它是值得的.它使我的代码更易于维护和扩展.
我目前正在研究的项目是使用范例,但没有设置系统.但是,我真的很想找到一些可以满足以下要求的系统.从我现在的状态切换到新系统需要花费一些时间,但是我稍后会节省多倍的时间.
要求:
让我详细说明这些要求:
跨平台
基本上,我需要它在Windows和Mac上工作.Linux会很好,但绝不是必不可少的.此外,它确实需要满足所有平台的其他要求.有一个适用于Mac的COM,这将是理想的,但它不支持要求4.此外,它必须支持GCC和MSVC.
快速
不幸的是,这就是CORBA失败的地方,尽管它满足了其他三个要求.进程内方法调用需要尽可能快(理想情况下,如COM),因为某些例程也可能从音频中断调用.
适用于C++
......我想这一点大多是显而易见的.我不介意不使用C++类来实现组件,虽然这将定义有用,并且替代方案必须仍然易于使用,特别是因为最终我打算发布第三方扩展的API.
支持跨进程编组
我的意思是至少能够序列化呼叫.如果这是通过IDL生成的代码完成的,那对我来说完全没问题,而且我也不介意实现跨进程通信本身.
COM会很棒,但它不能完全满足要求1.CORBA也会很棒,但它不符合要求2(即使有最快的ORB).XPCOM可能不符合要求2,并且不适用于MSVC,因此不符合要求1.
有什么想法吗?我的下一步是使用protobufs或类似的东西来推销自己,但我当然希望避免这种情况.
更新
详细说明 - 在此上下文中的音频中断可以低至2-3ms.那个时间甚至不能完全提供给我,因为其他组件需要在那个时间处理,而我的软件本身就包含了另一个需要在那个时间处理的软件.这就是为什么在进程和跨进程编组都需要非常快的原因.
我可能在这里遗漏了一些明显的东西 - 为什么我不能以这种方式使用 std::get ?
#include <map>
#include <iterator>
#include <set>
#include <algorithm>
#include <utility>
int main() {
std::map<int, double> some_map;
std::set<int> set_of_ints;
std::transform(
some_map.begin(),
some_map.end(),
std::inserter( set_of_ints, set_of_ints.begin() ),
std::get<0> );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我尝试的编译器是 VS2010 以及 Ideone.com 用于 C++14 的任何编译器(一些最近的 GCC?)。这是后者的输出:
prog.cpp: In function 'int main()':
prog.cpp:17:28: error: no matching function for call to 'transform(std::map<int, double>::iterator, std::map<int, double>::iterator, std::insert_iterator<std::set<int> >, <unresolved overloaded function type>)'
std::get<0, int, double> );
^
prog.cpp:17:28: note: candidates are:
In file included from /usr/include/c++/4.9/algorithm:62:0, …Run Code Online (Sandbox Code Playgroud)