小编Mat*_*att的帖子

带有std :: string的Literal类只适用于模板特化?

我的编译器不允许使用以下定义,因为它std::string有一个非平凡的析构函数(teststr理所当然,当成员没有时,它不能有一个简单的dtor):

class teststr
{
private:
    std::string _m;
public:
    constexpr teststr(std::string value) : _m(value) {};

    constexpr std::string m() const { return _m; }
    void m(std::string value) { _m = value; }
};
Run Code Online (Sandbox Code Playgroud)

但是,teststr允许以下等效(据我所知)定义:

template<typename T>
class test
{
private:
    T _m;
public:
    constexpr test(T value) : _m(value) {};

    constexpr T m() const { return _m; }
    void m(T value) { _m = value; }
};

typedef test<std::string> teststr;
Run Code Online (Sandbox Code Playgroud)

模板允许这个定义的类型是什么?

c++ templates c++11

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

在一组数字中找到一个独特的位

解释这一点的最佳方式是演示.

有一组数字.它们可能会重复,因此:

1110,0100,0100,0010,0110 ......

我正在寻找的数字是有点设置的数字,不会出现在任何其他数字中.结果是数字(在这种情况下为1 - 第一个数字)和位位置(或掩码很好)所以1000(第4位).可能有多个解决方案,但为此目的,它可能是贪婪的.

我可以通过迭代来做...对于每个数字N,它是:

N&〜(其他数字也在一起)

但是比特的本质是,如果你在盒子外思考,总有一种更好的方法.例如,出现多次的数字永远不会有唯一的位,并且对ORing没有影响.

c bit-manipulation

2
推荐指数
1
解决办法
250
查看次数

使用模板时初始化数组

假设我上课了Foo.以下工作正常:

class Foo
{
    public:
        const int* bar;

        Foo()
        {
            bar = new int[2] {1, 2};
        }
};
Run Code Online (Sandbox Code Playgroud)

但是,我尝试稍微改变一下以使用模板:

template<int A, int B>
class Foo
{
    public:
        const int* bar;

        Foo()
        {
            bar = new int[2] {A, B};
        }
};
Run Code Online (Sandbox Code Playgroud)

我的方法模板工作的理解是,A和B基本上编译时间常数,所以它应该仍然工作一样.

我用g ++编译时得到的错误信息(链接中为4.5,与4.6.3相同的错误)是:

错误:ISO C++禁止在数组中初始化[-fpermissive]

使用4.7时会出现类似的错误,但略有不同:

错误:数组中的括号初始值设定项[-fpermissive]

问题也发生在模板函数中,而不仅仅是在大括号内使用模板参数进行初始化,代码和输出时.(感谢Philipp)

c++ gcc g++ class c++11

2
推荐指数
1
解决办法
1377
查看次数

匹配文件的开头或换行符(Ragel)

我用ragel和C作为主语.

我只能使用'\n'来识别换行符,但我需要识别文件的开头作为替代.

在正则表达式的其他实现中,这可以由\A或给出$,但是$为了其他目的而保留,'\A'映射到其他东西(警报?)并\A给出解析器错误.

ragel

2
推荐指数
1
解决办法
389
查看次数

标签 统计

c++ ×2

c++11 ×2

bit-manipulation ×1

c ×1

class ×1

g++ ×1

gcc ×1

ragel ×1

templates ×1