我试图了解标准的简单CRTP模式是否有效.
下面的代码编译并按预期工作(在clang上).
但是我对相关标准章节/段落的理解是,虚函数CRTP <Derived,Base> :: DoSomething()的实例化应该在代码的点(B)处,其中Derived的完整声明不是可用.因此内部typedef类型也不应该可用.
任何人都可以指出验证此代码的相关标准章节吗?
换句话说,在这种情况下,虚拟函数被实例化ATFER点C?非常感谢您的任何见解.
弗朗切斯科
//-------------------------
// START CODE
#include <iostream>
struct Type1 {};
struct Type2 {};
struct Base
{
virtual ~Base() {}
virtual void DoSomething() = 0;
};
template< typename T, typename U >
struct CRTP : U
{
virtual void DoSomething() { DoSomething( typename T::Type() ); }
void DoSomething( Type1 ) { std::cout << "1\n"; }
void DoSomething( Type2 ) { std::cout << "2\n"; }
};
// (A) point of inst. of CRTP< Derived, …Run Code Online (Sandbox Code Playgroud) 在为我正在研究的iPhone/iPad小项目做一些测试时,我观察到使用gl_LrawElements和GL_LINES绘制线框时会有很大的CPU性能损失.
这是场景:
然后:
在这两种情况下,模型看起来都像预期的那样,周围没有任何错误......
似乎问题是设备依赖的.我在iPhone 3GS和iPhone 4上体验它,而不是iPad 2和模拟器.在iPad 2帧时间CPU = 1ms并且没有调用gleRunVertexSubmitARM,在iPhone 4帧时间CPU = 12ms并且连续调用gleRunVertexSubmitARM.
任何人都可以解释这种行为或指出我可能犯的错误吗?
任何见解都受到高度赞赏.提前致谢,
弗朗切斯科