类型比较的Boost静态断言

Boost Static Assertion for Type Comparision

本文关键字:静态 断言 Boost 比较 类型      更新时间:2023-10-16

下面的问题给我带来了编译器错误,我不知道如何正确地编写

struct FalseType { enum { value = false }; };
struct TrueType { enum { value = true }; };

template <typename T1, typename T2>
struct IsSame
{
typedef typename FalseType Result;
};

template <typename T>
struct IsSame<T,T>
{
typedef typename TrueType Result;
};
BOOST_STATIC_ASSERT( (IsSame< Foo::FooClass1 , Foo::FooClass1 >::Result::value) );

这个静态断言在使用时不应该失败,但CUDA的编译器NVCC不知何故给了我以下错误:

error C2338: (IsSame< Foo::FooClass1 , Foo::FooClass1 >::Result::value)

我不知道该怎么办,所有其他静态断言都有效,但类型比较不起作用,上面出了什么问题?打字错误支架?

我无法获得在NVCC下工作的类型比较?

有什么想法吗?

看来MSVC(由NVCC路由到(在上述版本中也有问题。。。。嗯…

===============编辑========================这里有一个在MSVC中不起作用的片段!

这个片段应该在MSVC中编译,但它没有,所以我假设编译器错误:

错误C2118:负下标(WHHHHHYYYY(奇怪。。。。

#include <iostream>

using namespace std;

struct FalseType { static const bool  value = false ; };
struct TrueType {  static const bool  value = true ; };

template <typename T1, typename T2>
struct IsSame
{
  typedef ::FalseType Result;
  static const bool result = false;
};

template <typename T>
struct IsSame<T,T>
{
typedef ::TrueType Result;
static const bool result = true;
};
namespace OtherType{
   struct Type1{};
};
template< typename _T> // Settings from below
struct Settings{
   typedef _T myT;
   typedef char static_assert_failed[ ((IsSame< _T,OtherType::Type1>::Result::value)) ? 1 : -1 ]; // USE HERE only ::result works, (BUT WHY)
};
int main(){
   cout << (IsSame<OtherType::Type1,OtherType::Type1>::Result::value)<< endl;
}
typedef typename FalseType Result;
typedef typename  TrueType Result;

这是错误的,因为FalseTypeTrueType不是从属名称,因此typename在这里是非法的。

应该是

typedef FalseType Result;
typedef  TrueType Result;

更新

看来

IsSame < _T, OtherType::Type1 >::Result::value 

是非法的。问题是

IsSame < _T, OtherType::Type1 >::Result 

必须由typename限定,但在语法上是不可能的,也就是说,以下内容也是非法的

(typename IsSame <_T, OtherType::Type1 >::Result)::value 

我找到了以下解决方案,使其发挥作用。

typedef typename IsSame <_T, OtherType::Type1 >::Result RealResult;
typedef char static_assert_failed[RealResult::value ? 1 : -1];

HTH。