- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个类 X
在 x.h
中声明并在 x.cpp
中定义,它必须运行一些代码(在中注册一些类元数据一个集中的地方)在静态初始化阶段使用宏 INIT(X)
。对于任何子类 Y
(在 y.h
中声明,包括 x.h
,在 y.cpp
中定义)也是如此X
- 它必须在全局范围内运行 INIT(Y)
。现在我想创建一个静态检查是否每个子类都已初始化。此外,我不知道我将链接多少个 X
子类。
我想在 x.h
中定义一个宏,如果存在 X
(或任何其他后代)的 SubClass
,它将生成编译器错误尚未调用 INIT(SubClass)
的 X
)。怎么做?
要求:
subclass.cpp
文件中调用。SubClass
在subclass.cpp
中有完整的定义。gcc
和msvc
。x.h
的 someotherclass.cpp
中生成错误,除非它定义了 X
的子类。#error
,例如 undefined variable 也可以。X
类中进行额外更改,但不需要在其任何子类中更改。INIT
放在 subclass.cpp
中的任何地方都必须在所有包含之后工作。在 X
的新基类中定义一个虚拟抽象方法是可行的,前提是我不需要不修改任何 X
的子类将它的声明放在那里并在 INIT
中定义。
下面是该设计的模板代码,其中 INIT
仅用于计算链接的 X
子类的数量 + 1。/*???*/
可以用任何东西代替,只要它有效。
x.h
:
#include <functional>
int &someGlobalInt();
class XInit {
public:
XInit(std::function<void ()> init) {
init();
}
};
#define INIT(cls) static XInit X_INIT_ ## cls = XInit([](){ \
++someGlobalInt(); \
/*???*/ \
})
class X {
/*???*/
};
/*???*/
x.cpp
:
#include "x.h"
int &someGlobalInt() {
static int x = 0;
return x;
}
INIT(X); // error without it
y.h
:
#include "x.h"
class Y: public X {};
y.cpp
:
#include "y.h"
INIT(Y); // error without it
main.cpp
:
#include <cstdio>
#include "x.h"
// no error, since no new X subclass is defined
int main() {
printf("%d\n", someGlobalInt()); // should print "2"
return 0;
}
最佳答案
作为 n.m.评论中提到,您可以使用 Curiously Recurring Template Pattern。你可以做这样的事情,我认为这比乱用这些 lambda 更清楚:
XInit.h
template <class T>
class XInit {
private:
static bool initialized;
static std::once_flag flag;
static void base_init<T>(){ std::call_once(flag, T::reserved_init);}
...
}
XInit.cpp
template <class T>
XInit<T>::initialized = XInit<T>::base_init();
现在您可以将宏定义为:
#define INIT(cls) static void reserved_init() {++someGlobalInt();}
现在您继承:
class X : public XInit<X> ...
请注意,如果您需要层次结构,没关系,只需执行以下操作:
class Y: public X, public XInit<Y>
注意这里没有任何多重继承,因为XInit<X>
和 XInit<Y>
是不同的类(class)。实际工作是在我们不断产生的新基类中完成的。现在,基类将始终尝试调用它的派生类的静态 reserved_init 成员。因此,如果未定义此成员,则会出现错误。因此,您需要将宏放在类定义中。
一如既往,如果用户真的想要,他们可以绕过这个问题。例如,他们可以定义另一个具有相同名称的函数。最后,我不认为你可以创建一个系统来防止故意滥用,但它应该可以防止无心之失。让我知道您对此解决方案的看法,也许我可以引入修改来修复它。
关于当子类没有使用另一个宏时 C++ 宏失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26221482/
我有一个包含在父 ScrollView (不是直接 subview )中的子 ScrollView 。我想要的是,一旦子 ScrollView 到达其内容的末尾,父 ScrollView 就开始沿相同
我有一个典型的 MVVM 场景: 我有一个绑定(bind)到 StepsViewModels 列表的 ListBox。 我定义了一个 DataTemplate,以便将 StepViewModels 呈
我的 firebase 数据库的结构如下图所示 image of my firebase DB stucture 每当有新消息时,它都会添加到特定的 ID 下,如图所示,它是“59a004ce9bfe
基本上,我的目标是尝试为整个 Web 项目创建一个键盘 Controller ,并且我希望能够保留在父文档上创建的键绑定(bind),并让子 iframe 继承它们。这可能吗? 这是我现在拥有的示例设
我正在开发一个 asp.net 网络应用程序。 有一个母版页的子窗体。母版页没有定义任何高度,但它为 子窗体 定义了一个 X px 高度。 在子表单上它有一个 fieldset 容器,在这 2 个 t
我有一个包含 PictureBox 和 Label 的 UserControl。控件在不同的事件(例如 onMouseEnter、OnMouseLeave)时在 PictureBox 中加载三个不同的
我有一个 viewpager,在其中一个 fragment 中,我有两个单独的 fragment ,分别包含一个垂直和一个水平的 recyclerview。 当我将水平 recyclerview 滚动
我正在尝试抽象一个我在应用程序中经常使用的模式,我可以在另一个屏幕中使用它,该屏幕应该发送来自另一个屏幕内的 TextInput 组件的 Prop 。问题是,当我将 TextInput 组件留空时,它
嵌套滚动? 我在 PageView 中有三个垂直页面我希望能够在两者之间切换。 页面由可滚动的 ListView 组成s。 当页面处于焦点时,显示的列表应该是垂直可滚动的,但是当列表滚动到任一端时,我
这个问题的 jsFiddle 可以在这里找到:http://jsfiddle.net/Hsw9F/1/ JavaScript(console.log 调试信息可在 jsFiddle 中找到) var
HTML: Software Update 2010
我正在制作一个响应式网站。我有 3 个 div (.block),我需要将它们水平放置在一起。 当屏幕足够宽时,这很容易实现。但是,当我使浏览器更窄时,第三个 div (3) 换行到下一行,但我想要的
资源和背景 https://jsfiddle.net/wwx100f8/69/ 我正在尝试创建一个可扩展/可折叠的 Accordion 来容纳餐厅的食物选项,这是一个类似于 Just-Eat 或 Hu
我有一个嵌套的 ViewPager,效果非常好。唯一的问题是,一旦子 ViewPager 位于最后一项并且我进一步滚动,父 ViewPager 就会滚动。我不想要这种行为。 我如何实现这一目标? 这是
例如,我有主要 Activity 。我打电话的地方: Intent callchild = new Intent(this, childActivity.class); startActivity(c
我有一个定义 FormGroup 的 Angular 组件,它有一个嵌套的 FormGroup 作为它的控件之一。 子 FormGroup 作为 @Input 参数传递给子 component,并且在
这个问题与another question I asked有关 基本上,我有 2 个水平对齐的 div。两者都位于名为“.Parent”的 div 中,因此结构如下: s
基本上我需要 div.content 具有 15px 的默认填充,除非 div 具有子 div.products-list。如果 .products-list 的子 div 存在,我需要 div.co
代码笔:http://codepen.io/anon/pen/qaVRqw 我试图让 innerDiv 在文本超出父 div 之前换行文本。让所有文本都显示在 innerDiv 中但又被换行的最佳方式
我有一个名为 main 的父 div。它有一堆子 div,我向左或向右浮动。 当我完成最后一个 float 时,主 div 的高度完全消失,打乱了我的页面布局。我给了它一个高度:100%;只是现在,但
我是一名优秀的程序员,十分优秀!