2013-06-28 44 views
2

是否可以写一个引用'this'指针的静态断言?我没有可用的C++ 11,而BOOST_STATIC_ASSERT不起作用。在静态断言中引用这个指针?

struct blah 
{ 
    void func() {BOOST_STATIC_ASSERT(sizeof(*this));} 
}; 

产地:

error C2355: 'this' : can only be referenced inside non-static member functions 
error C2027: use of undefined type 'boost::STATIC_ASSERTION_FAILURE' 

在MSVC 2008

动机:

#define CLASS_USES_SMALL_POOL() \ 
    void __small_pool_check()  {BOOST_STATIC_ASSERT(sizeof(*this) < SMALL_MALLOC_SIZE;} \ 
    void* operator new(size_t) {return SmallMalloc();}         \ 
    void operator delete(void* p) {SmallFree(p);} 
+0

我想的sizeof总是编译时间?这对于这个例子很有用,但我试图实现这个宏而不会冗余地命名这个类型,参见动机部分。 –

+0

没关系。现在是凌晨1:30。不应该在这样的时间回答问题。你是对的。 '*这个'具有明确的类型。 – StoryTeller

+2

'int未使用[SMALL_MALLOC_SIZE-sizeof(* this)];' –

回答

2

的问题是,BOOST_STATIC_ASSERT,它解析成C++构建体,在其中的this关键字具有不同的含义。

来解决这个你周围可以试试这个:

struct blah 
{ 
    void func() 
    { 
     const size_t mySize = sizeof(*this); 
     BOOST_STATIC_ASSERT(mySize); 
    } 
}; 
+0

是的,应该想到这一点,谢谢! –

0

我试着在GCC explorere你的代码,它编译罚款。不知道为什么升级版本无法正常工作,尤其是出现这种错误。

struct blah 
{ 
    int a, b; 
    void func() {static_assert(sizeof(*this) > 4, "big");} // triggers if you remove b. 
}; 

// -Wall -pedantic --std=c++11 
+0

BOOST_STATIC_ASSERT似乎奇怪地为MSVC实施 –