相关疑难解决方法(0)

C++编译时常量检测

存在库源可用的情况,并且它通常必须支持变量参数,但实际上这些参数通常是常量.

然后可以通过对常量参数的特殊处理来优化事物(例如,使用静态数组而不是堆分配),但为此必须首先确定某些事物是否是常量(或者可能定义一些宏,但它不太方便).

所以这是一个有效的实现.

更新:也在这里:http://codepad.org/ngP7Kt1V

  1. 它真的是一个有效的C++吗?
  2. 有没有办法摆脱这些宏?(is_const()不能是函数,因为函数依赖在数组大小表达式中不起作用;它也不能是模板,因为它也不接受变量参数.)

更新:这是一个更符合预期用途的更新.if(N==0)如果N不是0 ,编译器将不会为分支生成任何代码.如果需要,我们可以切换到完全不同的数据结构.当然它不完美,但这就是我发布这个问题的原因.


 #include <stdio.h>

struct chkconst { struct Temp { Temp( int x ) {} }; static char chk2( void* ) { return 0; } static int chk2( Temp ) { return 0; } }; #define is_const_0(X) (sizeof(chkconst::chk2(X))<sizeof(int)) #define is_const_0i(X) (sizeof(chkconst::chk2(X))>sizeof(char)) #define is_const(X) is_const_0( (X)^((X)&0x7FFFFFFF) ) #define const_bit(X1,bit) (is_const_0i((X1)&(1<<bit))<<bit) #define const_nibl(X1,bit) const_bit(X1,bit) | const_bit(X1,(bit+1)) | const_bit(X1,(bit+2)) | const_bit(X1,(bit+3)) #define const_byte(X1,bit) const_nibl(X1,bit) | const_nibl(X1,(bit+4)) #define const_word(X1,bit) const_byte(X1,bit) …
Run Code Online (Sandbox Code Playgroud)

c++ templates metaprogramming compile-time-constant

9
推荐指数
1
解决办法
3964
查看次数

为什么更喜欢基于typedef的静态断言的基于模板的静态断言?

对于没有内置的C++版本,有两种广泛使用的静态断言实现static_assert.

第一个用于Boost并使用模板和该模板的特化:

template <bool> struct static_assert;
template <> struct static_assert<true> {}; // only true is defined
#define  STATIC_ASSERT(x) static_assert<(x)>()
Run Code Online (Sandbox Code Playgroud)

这里一旦检查的条件为false,编译器就无法找到模板的通用版本,编译失败.

第二个使用typedef:

#define STATIC_ASSERT( x ) typedef char __STATIC_ASSERT__[( x )?1:-1]
Run Code Online (Sandbox Code Playgroud)

这里一旦违反了检查条件,编译器就会尝试typedef一个大小为-1的数组,这是非法的,因此是编译时错误.

对我来说后者更好,因为它保证不发出代码,也可以像这样使用(从这里):

template<int Shift> class BinaryFlag {
    STATIC_ASSERT( 0 <= Shift && Shift < sizeof( DWORD) * CHAR_BIT );
    public:
    static const DWORD FlagValue = static_cast<DWORD>( 1 << Shift );
};
#define BINARY_FLAG( n ) CBinaryFlag<n>::FlagValue
Run Code Online (Sandbox Code Playgroud)

而前者不能那样使用.

有没有理由更喜欢静态断言的前一个实现而不是后者?

c++ templates static-assert visual-c++

8
推荐指数
1
解决办法
4364
查看次数

一个断言宏,在可能的情况下扩展为static_assert?

我有一些通用代码需要对成员函数的结果运行断言.该成员函数可以是constexpr,也可以不是.

template<typename T>
void foo(T t) {
  assert(t.member_function() == 10);
}
Run Code Online (Sandbox Code Playgroud)

因为t.member_function() 可能是一个常量表达式,我想知道static_assert在这种情况下是否可以将其视为a ,但是否则默认为正常assert.这可能吗?

c++ assert static-assert

5
推荐指数
1
解决办法
316
查看次数