在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)
这个技巧有一个共同的名字吗?
我有两个(或更多)模板,每个模板都可以调整一组特定的类,这些类由一个概念标识.为了使两个模板具有相同的名称,它们必须是特化.
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)指向断言.我可以以某种方式使基本模板不被选中,所以我会得到一条错误消息,告诉没有模板匹配参数类?
我为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中?
或者我应该问:
=======================================
这个bugzilla条目c ++/49673似乎表明我的已知问题,可能已在GCC 4.7中修复.不幸的是,我更喜欢使用内置的Mentor/CodeSourcery,它仍然是4.6.3.所以我想暂时我会遇到这个bug.:(
半小时前我发现了可变参数模板参数,现在我完全迷上了.
我有一个基于静态类的抽象,用于微控制器输出引脚.我想将多个输出引脚分组,以便将它们作为一个引脚处理.下面的代码有效,但我想我应该能够在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恤<>是否有问题,或者是否有可能结束递归
我想写模板来构造让我们说一个输入端口.这可以从单个输入输出端口或输入引脚列表中完成.我更喜欢这些模板具有相同的名称.我有输入输出端口和输入引脚的概念.我可以写
template< typename... arguments >
struct port_in ....
template< pin_in T >
struct port_in<> ....
Run Code Online (Sandbox Code Playgroud)
但现在列表版本将接受任何类型.我可以在实现中检查它,但这会降低用户在传递不适合的类型时获得的错误消息.我可以以某种方式将列表限制为一种类型,但允许另一种类型的单个模板参数吗?