小编Use*_*ess的帖子

在定义失败之前使用constexpr函数

我遇到了一些麻烦constexpr.C++ Primer一书显示了一行代码:

  constexpr int sz = size(); // only size() is a constexpr function
                             // this code is right
Run Code Online (Sandbox Code Playgroud)

然而,这本书没有给出一个具体的例子.所以我自己尝试以下代码:

#include <iostream>
constexpr int fun();
int main()
{
    constexpr int f = fun();
    std::cout << f << std::endl;
}
constexpr int fun()
{
    return 3;
}
Run Code Online (Sandbox Code Playgroud)

但我的编译器说fun()是未定义的.

如果我constexpr改成const,它运行良好,如果我在使用之前更改我的代码以定义constexpr函数:

#include <iostream>
constexpr int fun()
{
    return 3;
}
int main()
{
    constexpr int f = fun();
    std::cout << f << std::endl; …
Run Code Online (Sandbox Code Playgroud)

c++

27
推荐指数
1
解决办法
1376
查看次数

带有强类型枚举的模板参数推导

如果我有一个普通(弱)枚举,我可以使用它的枚举值作为非类型模板参数,如下所示:

enum { Cat, Dog, Horse };

template <int Val, typename T> bool magic(T &t)
{
    return magical_traits<Val>::invoke(t);
}
Run Code Online (Sandbox Code Playgroud)

并称之为: magic<Cat>(t)

据我所知,如果我有一个强类型的枚举,并且不想硬编码枚举类型,我最终得到:

enum class Animal { Cat, Dog, Horse };

template <typename EnumClass, EnumClass EnumVal, typename T> bool magic(T &t)
{
    return magical_traits<EnumVal>::invoke(t);
}
Run Code Online (Sandbox Code Playgroud)

现在我得写:magic<Animal, Animal::Cat>(t)这似乎是多余的.

有没有办法避免输入枚举类和值,缺少

#define MAGIC(E, T) (magic<decltype(E), E>(T));
Run Code Online (Sandbox Code Playgroud)

c++ templates strong-typing template-argument-deduction c++17

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

创建和/或推送新分支时Git挂钩

我想挂钩创建一个新的分支.创建分支时或第一次完成时.一种或两种可能吗?

git

23
推荐指数
2
解决办法
8073
查看次数

"缺少模板参数"是什么意思?

我是C++和这个网站的新手,所以肯定会有错误.当我尝试编译我的代码时,我得到的错误就像error: missing template argument before 'b'.几个小时以来,我一直在寻找世界的答案,这让我在这里.

我的任务是实现一个模板化的类Collection,它使用数组存储一个Object集合,以及集合的当前大小.

    #include <iostream>
    #include "collection.h"

    using namespace std; v

    int main(int argc, char* argv[])
    {
       collection b;  //<----error missing template argument before 'b'
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)
    #ifndef COLLECTION_H
    #define COLLECTION_H

    #include <iostream>

    template <typename obj>
    class collection
    {
    public:
        collection();
        bool isEmpty() const;
        void makeEmpty();
        void insert(obj val);
        void remove(obj val);
        bool contains(obj val) const;
    private:
        size_t size;
        obj* col[];
    };

    #endif
Run Code Online (Sandbox Code Playgroud)
    #include "collection.h"

    template <typename obj>
    collection<obj>::collection() :size(10)
    {
        col = …
Run Code Online (Sandbox Code Playgroud)

c++ templates

13
推荐指数
3
解决办法
6万
查看次数

使用freopen()打印到文件和屏幕

我试图使用freopen()打印到文本文件和屏幕,但我只是实现打印到文件.

我想知道是否有一个容易将程序输出保存到文件并将其打印到屏幕?因为我以另一种方式工作,但最终我不得不打印两次声明.一个用于文件,另一个用于输出.

注意:我是C++的新手,我正在尝试为下一学期的课程学习它,所以需要直接的答案,因为我已经在线查看,除此之外找不到任何简单的答案.

这是我到目前为止:

#include<iostream>
#include<time.h>
#include<stdlib.h>
#include<fstream>

using namespace std; 

void menu(){
    cout << "\t********************************************************\n"
         << "\t* Welcome to slot machine.                             *\n"
         << "\t* Would you like to play? (1 to play, 2 not to play)   *\n"
         << "\t********************************************************\n\n";
    return;
}

void update(int arr[], int &token) {
    if (arr[0]==arr[1] && arr[1]==arr[2]) {
        token+=4;
        cout << "You win\n\n";
    } else if (arr[0]==arr[1] || arr[1]==arr[2] || arr[0]==arr[2]) {
        token+=1;
        cout << "You got two out of three\n\n";
    } else {
        token-=1; …
Run Code Online (Sandbox Code Playgroud)

c++ freopen

12
推荐指数
2
解决办法
4705
查看次数

使用两个星号在git中添加文件

我想添加一个文件,该文件具有唯一的文件名,但前面的路径很长(例如a/b/c/d/filename.java).通常我会通过这样做将它添加到我的存储库中

git add *filename.java.

不过我之前也这样做过:

git add a/b/c/d/filename*

所以我试着将两者结合起来:

git add *filename*

但这确实很奇怪.它添加了每个未跟踪的文件.我可以看到失败的可能原因,但它们都应该出现在前两个命令之一中,所以我不知道为什么会发生这种情况.

我的问题不在于如何使用文件名将文件添加到git存储库(尽管这很有用).我的问题是我对*操作的误解是什么让我认为上述应该有效.

信息:

我正在使用Git Bash for Windows,它基于minGW.

regex git glob wildcard git-bash

11
推荐指数
1
解决办法
8937
查看次数

我应该什么时候输入structdef struct to指向struct?

我不是低级非面向对象编程语言的专家,我正在为工作中的项目编写一些C代码.我正在尝试创建一些不错的抽象数据类型,并且谷歌搜索让我意识到人们在两个方面使用基于结构的ADT.有些人将数据类型定义为结构:

typedef struct adt {
    //content here
} adt;
Run Code Online (Sandbox Code Playgroud)

并在头文件中将其公开给世界.

其他人将数据类型定义为struct 的指针:

// In .c file:
typedef struct adt_s {
    //content here
} adt_s, *adt;


// In .h file:
typedef struct adt_s *adt;
Run Code Online (Sandbox Code Playgroud)

我知道这种方法允许你键入一个结构,而不给外界任何关于这个结构内部的知识,所以程序员只能使用同一个头文件中提供的函数来操作这个数据类型.

是否有其他理由可以选择另一个?当定义ADT作为结构时,是否存在一般的"经验法则"?我们何时将它们定义为结构的指针?

c struct typedef abstract-data-type

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

重载"operator ++"返回一个非const,并且铿锵有力的抱怨

我刚从clang-tidy得到以下警告:

overloaded "operator++" returns a non-constant object 
 instead of a constant object type
Run Code Online (Sandbox Code Playgroud)

https://clang.llvm.org/extra/clang-tidy/checks/cert-dcl21-cpp.html

不幸的是,他们提供的链接不起作用,https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId = 88046682没有简单的方法来找到这个规则(看似DCL规则开始从50).

但无论我在标准中看到什么(对于ex 16.5.7增量和减量[over.inc]),我都没有找到postfix operator ++应该返回const的引用:

struct X {
    X operator++(int); // postfix a++
};
Run Code Online (Sandbox Code Playgroud)

问题:只是铿锵过度保护,错误或为什么我要声明后缀的返回类型为const?

c++ operator-overloading postfix-operator clang-tidy

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

为什么不能同时绑定到0.0.0.0:80和192.168.1.1:80?

我的python测试代码:

import socket

s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s1.bind(('192.168.1.1', 80)) 
s1.listen(5)

s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2.bind(('0.0.0.0', 80)) 
s2.listen(5)
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

fpemud-workstation test # ./test.py
Traceback (most recent call last):
  File "./test.py", line 11, in <module>
    s2.bind(('0.0.0.0', 80)) 
  File "/usr/lib64/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use
Run Code Online (Sandbox Code Playgroud)

192.168.1.1是我的eth0接口的ip地址.
我认为0.0.0.0:80和192.168.1.1:80应该能够共存.
带有dst-addr 192.168.1.1的数据包进入套接字s1,带有其他dst-addr的数据包进入套接字s2.

python sockets linux

7
推荐指数
1
解决办法
6102
查看次数

atomic_thread_fence(memory_order_seq_cst)是否具有完整内存屏障的语义?

完整/通用内存屏障是在屏障之前指定的所有LOAD和STORE操作看起来发生在屏障之后相对于系统的其他组件指定的所有LOAD和STORE操作之前的屏障.

根据cppreference,memory_order_seq_cst等于memory_order_acq_rel在所有标记的操作上加上单个总修改顺序.但据我所知,C++ 11中的获取和释放栏都没有强制执行#StoreLoad(加载后存储)排序.发布围栏要求以后的任何写入都不能重新排序先前的读/写; 获取围栏要求不能对任何先前的读取重新排序后续读/写.如果我错了,请纠正我;)

举个例子,

atomic<int> x;
atomic<int> y;

y.store(1, memory_order_relaxed);            //(1)
atomic_thread_fence(memory_order_seq_cst);   //(2)
x.load(memory_order_relaxed);                //(3)
Run Code Online (Sandbox Code Playgroud)

是否允许优化编译器将指令(3)重新排序到之前(1),以使其有效看起来像:

x.load(memory_order_relaxed);                //(3)
y.store(1, memory_order_relaxed);            //(1)
atomic_thread_fence(memory_order_seq_cst);   //(2)
Run Code Online (Sandbox Code Playgroud)

如果这是一个有效的转换,那么它证明atomic_thread_fence(memory_order_seq_cst)并不一定包含完整障碍所具有的语义.

c++ c++11

7
推荐指数
2
解决办法
1256
查看次数