C++ 对齐是否是指向模板化对象的指针的问题?(C+;+;)
我正在使用模板嵌套类来存储类型。该类没有数据成员,但它确实有模板方法,这些方法返回bool作为类型比较的结果C++ 对齐是否是指向模板化对象的指针的问题?(C+;+;),c++,templates,pointers,C++,Templates,Pointers,我正在使用模板嵌套类来存储类型。该类没有数据成员,但它确实有模板方法,这些方法返回bool作为类型比较的结果 // Someheader.h #include < new > #include < type_traits > // ... class foo { private: template < typename T > class bar { public: bar ( ) { } ~
// Someheader.h
#include < new >
#include < type_traits >
// ...
class foo {
private:
template < typename T >
class bar {
public:
bar ( ) { }
~bar ( ) { }
template < typename U >
bool convertible_to ( const U& hint ) {
return std::is_convertible < T, U > :: value;
}
template < typename U >
bool convertible_from ( const U& hint ) {
return std::is_convertible < U, T > :: value;
}
};
bar < void >* helper;
public:
foo ( ) { }
~foo ( ) { delete helper; } // Correction from Kerrek SB here.
template < typename T >
foo ( const T& hint ) :
helper ( &( ::new ( helper ) bar < T > ( ) ) )
{}
template < typename U >
bool convertible_to ( const U& hint ) {
return helper -> convertible_to ( hint );
}
template < typename U >
bool convertible_from ( const U& hint ) {
return helper -> convertible_from ( hint );
}
};
//Someheader.h
#包括
#包括
// ...
福班{
私人:
模板
分类栏{
公众:
bar(){}
~bar(){}
模板
布尔可转换对象(常量和提示){
返回std::是可转换的::值;
}
模板
bool敞篷车来源(常量和提示){
返回std::is_可转换::值;
}
};
条形图*助手;
公众:
foo(){}
~foo(){delete helper;}//这里是Kerrek SB的更正。
模板
foo(常量T和提示):
辅助对象(&(::新建(辅助对象)栏())
{}
模板
布尔可转换对象(常量和提示){
返回helper->convertible_to(提示);
}
模板
bool敞篷车来源(常量和提示){
返回帮助者->可转换的对象(提示);
}
};
我有点担心我使用新的布局。类栏没有数据成员,但我不知道指针对齐是否是模板类型的问题。假设T=int,int需要一些对齐方式n*2^m。指向模板类型为int的模板对象的指针是否继承了该要求
我似乎找不到有关此主题的任何内容,因此如果这是一个愚蠢的问题,我深表歉意。对齐并不重要,因为您从未直接使用该类型。然而,这段代码基本上并没有按照您期望的方式工作。它将始终调用
foo::bar::convertable_to
和foo::bar::convertable_from
。另外,它不是类型安全的。helper
在您的代码中未初始化…?析构函数~foo()
是纯货物邪教。除了delete helper之外,所有这些都不是必需的代码>。它在模板构造函数中初始化。在我的用例中,默认构造函数不会产生任何有意义的东西,因为foo是类型擦除对象的包装器。编辑:谢谢你,Kerrek SB。我不知道是否所有的实现都是这样。它在模板构造函数中的内部使用是未初始化的。这就像:x(x)
…Placement new需要显式调用析构函数,而不是delete
(参见示例)-例如helper->~bar()
,我应该早点说谢谢,但无论如何,谢谢。如果声明并使用的是bar,而不是bar*,则可以让编译器确认您所说的内容。另外,对于其他可能在这里登陆的读者来说,是的,这个例子绝对不是类型安全的。我的实际代码与之类似,但我试图找到一种方法来恢复在类型擦除中丢失的一些功能。如果只有type类可以采用typeid结构就好了!