我有这样的结构(由于某种原因我不能使用数组):
struct OperatorData
{
char m_record_0[RIX_OPERATOR_CONFIG_SIZE];
char m_record_1[RIX_OPERATOR_CONFIG_SIZE];
//....
char m_record_9[RIX_OPERATOR_CONFIG_SIZE];
};
Run Code Online (Sandbox Code Playgroud)
我试图在编译时计算字段数量:
enum {fieldsAmount = sizeof(OperatorData) / sizeof(OperatorData::m_record_0)};
Run Code Online (Sandbox Code Playgroud)
编译器会报告这样的消息:
Error: #245: a nonstatic member reference must be relative to a specific object
enum{fieldsAmount = sizeof(OperatorData) / sizeof(OperatorData::m_record_0)};
^
Run Code Online (Sandbox Code Playgroud)
我使用keil uVision3 V3.60.在结构内部或外部放置枚举声明并不重要.为什么编译器不能占用这个元素的大小?
我写了一个简单的例子,它使用基类接口和dynamic_cast以及非虚函数调用来估计调用虚函数的平均时间.就这个:
#include <iostream>
#include <numeric>
#include <list>
#include <time.h>
#define CALL_COUNTER (3000)
__forceinline int someFunction()
{
return 5;
}
struct Base
{
virtual int virtualCall() = 0;
virtual ~Base(){};
};
struct Derived : public Base
{
Derived(){};
virtual ~Derived(){};
virtual int virtualCall(){ return someFunction(); };
int notVirtualCall(){ return someFunction(); };
};
struct Derived2 : public Base
{
Derived2(){};
virtual ~Derived2(){};
virtual int virtualCall(){ return someFunction(); };
int notVirtualCall(){ return someFunction(); };
};
typedef std::list<double> Timings;
Base* createObject(int i)
{
if(i …Run Code Online (Sandbox Code Playgroud) 我本质上有以下代码:
typedef std::function<void ()> fnGlobalChangeEvent;
typedef std::vector<fnGlobalChangeEvent> GlobalTriggers;
inline void ExecuteGlobal(fnGlobalChangeEvent ev)
{
ev();
}
GlobalTriggers triggers;
std::for_each(triggers.begin(), triggers.end(), std::bind(&ExecuteGlobal, _1));
Run Code Online (Sandbox Code Playgroud)
在这里使用ExecuteGlobal感觉完全是多余的,但我找不到正确的语法来退出调用.
std::for_each(triggers.begin(), triggers.end(), ExecuteGlobal(_1));
std::for_each(triggers.begin(), triggers.end(), std::bind(_1));
Run Code Online (Sandbox Code Playgroud)
两者都无法编译.
还有一个更复杂的案例:
typedef std::function<void (Zot&)> fnChangeEvent;
typedef std::vector<fnChangeEvent> Triggers;
inline void Execute(fnChangeEvent ev, Zot& zot)
{
ev(zot);
}
Triggers triggers;
std::for_each(triggers.begin(), triggers.end(), std::bind(&Execute, _1, zot));
Run Code Online (Sandbox Code Playgroud)
在这些情况下,是否可以不使用辅助函数?
我们正在从MPC转向 CMake。我们提供了一个包含一些示例的库。样本附带 makefile。
问题是由 cmake 生成的 makefile 包含绝对路径,但不包含相对路径:
# The main all target
all: cmake_check_build_system
cd /.../Projects/cpp_trunk && $(CMAKE_COMMAND) -E cmake_progress_start /.../Projects/cpp_trunk/CMakeFiles /.../Projects/cpp_trunk/samples/CMakeFiles/progress.make
cd /.../Projects/cpp_trunk && $(MAKE) -f CMakeFiles/Makefile2 samples/all
$(CMAKE_COMMAND) -E cmake_progress_start /.../cpp_trunk/CMakeFiles 0
Run Code Online (Sandbox Code Playgroud)
因此,当它被复制时,它就被破坏了。有什么办法可以解决吗?
UPD:我已阅读常见问题解答,但我的问题仍在发生,也许有人设法解决了?
可以在模板定义之外专门化一些类成员函数:
template<class A>
struct B {
void f();
};
template<>
void B<int>::f() { ... }
template<>
void B<bool>::f() { ... }
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我甚至可以省略f一般类型的函数定义A.
但是如何把这个专业化放在课堂上呢?像这样:
template<class A>
struct B {
void f();
void f<int>() { ... }
void f<bool>() { ... }
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下我应该使用什么语法?
编辑:目前使用最少代码行的解决方案是添加假模板函数f定义并从原始函数显式调用它f:
template<class A>
struct B {
void f() { f<A>(); }
template<class B>
void f();
template<>
void f<int>() { ... }
template<>
void f<bool>() { ... }
};
Run Code Online (Sandbox Code Playgroud) 可能重复:
虚函数和性能 - C++
我有一些课:
class I
{
public:
virtual void foo() = 0;
protected:
virtual ~I(){}
};
Run Code Online (Sandbox Code Playgroud)
此类不提供实例删除的接口,因此使析构函数保护是非常合理的解决方案.因此,不必将析构函数设为虚拟.但我有代码,它是虚拟的.
它看起来不是一个大错误,但它对于代码性能是否显着?当我们创建虚拟功能时,我们将另外一条记录添加到虚拟功能表中,当我们进行虚拟呼叫时,我们在此表中搜索.所以这意味着查找时间会增加.我对吗?
c++ ×7
performance ×2
c++11 ×1
cmake ×1
dispatch ×1
dynamic-cast ×1
makefile ×1
std ×1
templates ×1