假设我有一个functionProxy带有泛型参数的函数function并调用它operator():
template< typename Function > void functionProxy( Function function ) {
function();
}
Run Code Online (Sandbox Code Playgroud)
传递给它的对象可能是:
一个仿函数:
struct Functor {
void operator()() const {
std::cout << "functor!" << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)功能:
void function( ) {
std::cout << "function!" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)一个(C++ 0x)lambda函数:
[](){ std::cout << "lambda!" << std::endl; }
Run Code Online (Sandbox Code Playgroud)int main( )
{
functionProxy( Functor() );
functionProxy( function );
functionProxy( [](){ std::cout << "lambda!" << std::endl; } );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器将能够内联function中 …
编辑:这不是一个错误,只是我不知道模板化基类中的依赖名称查找(MSVC"有帮助"解决没有错误).
我前段时间写了一个functor实现,还有一个使用它的简单"Event"包装器.它在MSVC下编译得很好,但GCC给出了基类中成员变量的错误subscribers,没有被声明; 改变subscribers以this->subscribers解决问题(!).它似乎只发生在奇怪的重复模板模式和部分模板专业化.
简化的来源(对于令人费解的模板使用感到抱歉......):
#include <vector>
template<typename TEvent>
struct EventBase
{
protected:
std::vector<int> subscribers;
};
template<typename TArg1 = void, typename TArg2 = void>
struct Event : public EventBase<Event<TArg1, TArg2> >
{
void trigger(TArg1 arg1, TArg2 arg2) const
{
// Error on next line
auto it = subscribers.cbegin();
}
};
template<typename TArg1>
struct Event<TArg1, void> : public EventBase<Event<TArg1> >
{
void trigger(TArg1 arg1) const
{
// Using `this` fixes error(?!)
auto it = …Run Code Online (Sandbox Code Playgroud) 我从 14 岁起就开始阅读游戏引擎书籍(当时我什么都不懂:P)现在很多年后我想开始为我的游戏引擎编写数学基础。我一直在思考如何设计这个“图书馆”。(我的意思是“有组织的文件集”)每隔几年就会出现新的 SIMD 指令集,我不希望它们被浪费。(请告诉我我是否错了。)
我希望至少具有以下属性:
编辑 - 我想让源代码可移植,这样它也可以在其他设备上运行,然后是 x86(-64)
所以我认为使用函数指针是一个很好的解决方案,我将其设置为静态并在程序开始时初始化。以及适合的函数(例如矩阵/向量的乘法)将调用的函数。
您认为这种设计的优点和缺点是什么(哪个更重要?)?是否有可能创建具有上述两种属性的它?
基督教
c++ ×3
function ×1
game-engine ×1
gcc ×1
inline ×1
name-lookup ×1
optimization ×1
simd ×1
templates ×1
visual-c++ ×1