我知道以下C++代理方法:
.与纯虚函数的接口
.Boost.Function
.最快可能的C++代表
.不可能快速的C++代表
.快速C++代表
.Fast C++ Delegate:Boost.Function'drop-in'替换和多播
每个都有其优点和缺点.有些更快,有些更灵活,有些更丰富,有些更符合标准,有些更便携,但我个人觉得自己喜欢第三种:Sergey Ryazanov的不可能快速的C++代表.但问题是他的代表不具备可比性:
我的代表无法比较.未定义比较运算符,因为委托不包含指向方法的指针.存根函数的指针在各种编译单元中可以不同.
读者回答了哪一个:
"在各种编译单元中,指向存根函数的指针可能不同." AFAIK,这不是真的.编译器需要重复使用在不同编译单元中生成的模板函数(我确信 - 但我认为Borland曾违反此规则).我认为这是因为类(不在"无名"命名空间中)使用外部链接,并且使用存根函数的方式总是会阻止它们被内联(尽管这不应该是一个问题,因为它取了函数的地址将强制生成非内联版本,并且链接器执行的"外部链接"将消除除一个类似命名的函数之外的所有函数(假定它们并且标准要求它们相同))...
如果您定义一个转换单元(cpp文件)的模板函数,然后在另一个转换单元中以不同方式定义相同的函数,则两个版本中只有一个将使其成为最终的可执行文件.(这实际上违反了"一个定义规则",但适用于GCC,至少......不确定MSVC.)重点是:[存根]的地址在不同的单位中是相同的.
如果您发现MSVC属实,我会敦促您更新文章(包括比较功能) - 如果MSVC是标准授权,就此而言.
现在这篇文章已有四年了,作者在过去三年左右没有回复任何评论,所以我想知道上述评论是否有任何优点,以及这个具体实施是否确实可以改为支持比较.C++标准是否明确禁止此类使用?如果是这样,那么最近的编译器是否在这方面符合标准?
谢谢.
在过去的两年里,我一直在我的项目中广泛使用智能指针(boost :: shared_ptr).我理解并欣赏他们的好处,我一般都喜欢他们.但是我越是使用它们,我就越想念C++的确定性行为,关于内存管理和RAII,我似乎更喜欢编程语言.智能指针简化了内存管理的过程并提供了自动垃圾收集等功能,但问题是一般使用自动垃圾收集和智能指针特别引入了(de)初始化顺序的某种程度的不确定性.这种不确定性使控制权远离程序员,并且正如我最近意识到的那样,它完成了设计和开发API的工作,
为了详细说明,我目前正在开发一个API.此API的某些部分要求在其他对象之前初始化或销毁某些对象.换句话说,(de)初始化的顺序有时很重要.举个简单的例子,假设我们有一个名为System的类.系统提供一些基本功能(在我们的示例中记录)并通过智能指针保存许多子系统.
class System {
public:
boost::shared_ptr< Subsystem > GetSubsystem( unsigned int index ) {
assert( index < mSubsystems.size() );
return mSubsystems[ index ];
}
void LogMessage( const std::string& message ) {
std::cout << message << std::endl;
}
private:
typedef std::vector< boost::shared_ptr< Subsystem > > SubsystemList;
SubsystemList mSubsystems;
};
class Subsystem {
public:
Subsystem( System* pParentSystem )
: mpParentSystem( pParentSystem ) {
}
~Subsystem() {
pParentSubsystem->LogMessage( "Destroying..." );
// Destroy this subsystem: deallocate memory, release resource, etc.
} …Run Code Online (Sandbox Code Playgroud) 要专门化类模板,必须重新定义底层基本模板中的所有成员函数(即非专用类模板),即使它们预计基本保持不变.有哪些可接受的方法和"最佳实践"可以避免此代码重复?
谢谢.
我想使用 SIMD 指令和编译器内在函数来优化我的 Vector 和 Matrix 类(准确地说是类模板)。我只想针对元素类型为“float”的情况进行优化。使用 SIMD 指令需要接触数据成员。由于我不想被维护两个单独的类的麻烦所困扰,因此我希望能够根据模板参数的类型启用/禁用某些数据成员。这种方法的另一个优点(如果适用的话)是,我可以将一般情况下的相同代码用于我不想为其编写专门化的函数。因此,我想用伪代码实现的是:
template< typename T >
class Vector3 {
if type( T ) == float:
union {
__m128 m128;
struct {
float x, y, z, pad;
};
};
else
T x, y, z;
endif
};
Run Code Online (Sandbox Code Playgroud)
我知道通过使用 Boost.enable_if 或类似的工具可以有条件地包含成员函数。不过,我正在寻找的是有条件地包含数据成员。一如既往,非常感谢您的帮助。也欢迎其他有效的建议。
谢谢。