Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对齐是否是指向模板化对象的指针的问题?(C+;+;)_C++_Templates_Pointers - Fatal编程技术网

C++ 对齐是否是指向模板化对象的指针的问题?(C+;+;)

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 ( ) { } ~

我正在使用模板嵌套类来存储类型。该类没有数据成员,但它确实有模板方法,这些方法返回bool作为类型比较的结果

// 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结构就好了!