小编Wou*_*jen的帖子

公共const和私有可写属性的名称?

在C++编程中,我经常想给用户一个类只读访问属性,并且该类本身具有读写访问权限.我讨厌XxxGet()方法,所以我经常使用public const &一个私有属性,如下所示:

class counter {
  private:
     int _count;

  public:
     const int & count;

     counter : _count( 0 ), count( _count ){}

     void inc( void ){ _counter++; }
};
Run Code Online (Sandbox Code Playgroud)

这个技巧有一个共同的名字吗?

c++

11
推荐指数
2
解决办法
419
查看次数

C++概念和模板专业化; 如何获得用户友好的编译器错误

我有两个(或更多)模板,每个模板都可以调整一组特定的类,这些类由一个概念标识.为了使两个模板具有相同的名称,它们必须是特化.

template< typename T >
struct pin_in { static_assert( always_false<T>::value, . . . ); };  

template< is_pin_in T >
struct pin_in< T > . . .

template< is_pin_in_out T >
struct pin_in< T > . . .
Run Code Online (Sandbox Code Playgroud)

当其中一个专业化匹配时,这可以正常工作.如果没有匹配,则选择基本模板,并且我得到断言失败.该机制有效.我喜欢概念!

但我收到的错误消息(GCC 7.2.0)指向断言.我可以以某种方式使基本模板不被选中,所以我会得到一条错误消息,告诉没有模板匹配参数类?

c++ templates c++-concepts

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

如何让GCC在ROM中放置C++ constexpr?

我为LPC1114编译,这是一个小型ARM(实际上是Cortex)目标.RAM比ROM更受限制.我使用最新的Mentor(CodeBenchLite)GCC编译器(GCC 4.6.3).我有一些我希望在ROM中拥有的常量对象.据我所知,下面代码中的ffx对象最终应该在ROM(代码)中,但它放在DATA中.

class flop {
    public:
       int x;
       constexpr flop( int x ) : x(x){}
};

 extern constexpr flop ffx( 1 );
Run Code Online (Sandbox Code Playgroud)

如何说服编译器预先计算对象并将其放在ROM中?

或者我应该问:

  • 我能以某种方式期望G ++编译器为ffx生成可ROMable数据
  • 如果是这样,我的代码是否正确
  • 如果是这样,支持G ++版本(我使用4.6,也许我需要4.7?)

=======================================

这个bugzilla条目c ++/49673似乎表明我的已知问题,可能已在GCC 4.7中修复.不幸的是,我更喜欢使用内置的Mentor/CodeSourcery,它仍然是4.6.3.所以我想暂时我会遇到这个bug.:(

c++ gcc arm constexpr

6
推荐指数
1
解决办法
1235
查看次数

C++可变参数模板类终止

半小时前我发现了可变参数模板参数,现在我完全迷上了.

我有一个基于静态类的抽象,用于微控制器输出引脚.我想将多个输出引脚分组,以便将它们作为一个引脚处理.下面的代码有效,但我想我应该能够在0参数而不是1上结束递归.

template< typename pin, typename... tail_args >
class tee {
public:

   typedef tee< tail_args... > tail;

   static void set( bool b ){
      pin::set( b );
      tail::set( b );   
   }   

};

template< typename pin >
class tee< pin > {
public:

   static void set( bool b ){
      pin::set( b );
   }   

};
Run Code Online (Sandbox Code Playgroud)

我试过这个,但编译器(gcc)似乎没有考虑到它:

template<>
class tee<> : public pin_output {
public:

   static void set( bool b ){}   

};
Run Code Online (Sandbox Code Playgroud)

错误消息很长,但它基本上说没有tee <>.我的T恤<>是否有问题,或者是否有可能结束递归

c++ templates template-meta-programming

6
推荐指数
1
解决办法
312
查看次数

C++模板可以(仅)匹配一种类型的列表,还是一种其他类型的列表?

我想写模板来构造让我们说一个输入端口.这可以从单个输入输出端口或输入引脚列表中完成.我更喜欢这些模板具有相同的名称.我有输入输出端口和输入引脚的概念.我可以写

template< typename... arguments > 
struct port_in ....

template< pin_in T > 
struct port_in<> ....
Run Code Online (Sandbox Code Playgroud)

但现在列表版本将接受任何类型.我可以在实现中检查它,但这会降低用户在传递不适合的类型时获得的错误消息.我可以以某种方式将列表限制为一种类型,但允许另一种类型的单个模板参数吗?

c++ templates variadic-templates c++-concepts

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