小编gri*_*ras的帖子

注册一个C++类,以便以后函数可以迭代所有已注册的类

我正在尝试编写一个在运行时动态加载其扩展的应用程序.我使用Boost预处理器库来编写预处理器函数,给定一个名称列表,为每个名称声明一个类(并使所有这些类成为某些AbstractPlugin类的子类),然后声明包含这些类的Boost MPL序列.然后我编写了一个类,它尝试指向AbstractPlugin,如果它可以转换为该MPL序列中的任何类型.这里的问题是我的预处理器功能需要我想要创建和加载的所有扩展的完整列表.是否有一些技术可以让我在一个单独的文件中注册每个扩展名?

更新:

我相信,我对情况的解释太模糊了,所以我决定让它更具体.

我想定义一个扩展类型的集合.对于每种扩展类型,可以有任意数量的扩展名.在运行期间,程序加载外部库,解析入口点函数,调用它,结果得到一个指针.然后它尝试将该指针强制转换为所有已注册的扩展类型(使用dynamic_cast,因此扩展类型的类都从某些多态基类继承).如果对某个扩展类型的强制转换成功,则在对该扩展类型的特殊处理程序的调用中使用已转换的指针.

扩展类型的数量在编译时是已知的(显然,扩展的数量是无限的).使用我的aproach,loader类使用这些知识来检查是否存在每个扩展类型的处理程序(如果没有,程序不编译).另外,我的aproach不强制扩展类型的类知道有关加载器的任何信息(因此很容易修改加载器).但是如果每个扩展类型都注册自己会更方便.

c++ metaprogramming registration boost-preprocessor

5
推荐指数
2
解决办法
5345
查看次数

在模板参数列表中使用decltype来推断出类成员的指针类型

当我尝试实例化这样的模板时,GCC给我一个"模板参数2无效"错误(见using Check行).我很好奇,我可以使用decltype模板参数列表之外的成员来获取指向成员的指针,但不在其中(请参阅变量的定义p2).事实上,Clang编译了这段代码.这是GCC中的一个错误,或者这段代码实际上是无效的,而且Clang只是过于包容?

template <class T, T t> struct checker_template {};

struct S { int n; };

int main() {
  S s;
  constexpr auto p1 = &S::n;
  constexpr auto p2 = &decltype(s)::n;
  using Check = checker_template<int S::*, &decltype(s)::n>;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ gcc templates c++11

5
推荐指数
1
解决办法
228
查看次数