小编Joh*_*ica的帖子

如何在编译时检查函数是否被调用

我试图在编译时确定是否调用了一个函数.具体来说,我想抛出静态断言失败,如果它是:

template <typename T>
auto Function(T value) -> std::enable_if<someCondition, int>
{
  // this is the function I want to call
}

template <typename... T>
int Function(T...)
{
  // This function should never be called, instead I want
  // a compile-time failure if this is called, because it
  // means the above function wasn't successfully resolved.
}
Run Code Online (Sandbox Code Playgroud)

我想这样做的原因是因为无法正确调用Function()正确的条件会导致数千行编译器错误消息,对于那些不熟悉代码库的人来说,这些消息都没有用.

我不希望把一个原因static_assertFunction,因为我们有很多的这些功能,我们有办法,而不是生成Catch-all通过宏,这避免了代码库的不必要的生长,同时产生更多的错误信息帮助版本.

可以这样做吗?

c++

16
推荐指数
1
解决办法
5506
查看次数

是否需要同步构造函数中非线程安全集合的变异?

如果我决定使用非线程安全的集合并同步其访问权限,我是否需要同步构造函数中的任何变异?例如,在下面的代码中,我理解列表的引用对于构造后的所有线程都是可见的,因为它是最终的.但我不知道这是否构成安全发布,因为构造函数中的add不是同步的,而是在ArrayList的elementData数组中添加一个引用,这是非final的.

private final List<Object> list;

public ListInConstructor()
{
    list = new ArrayList<>();
    // synchronize here?
    list.add(new Object());
}

public void mutate()
{
    synchronized (list)
    {
        if (list.checkSomething())
        {
            list.mutateSomething();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

java multithreading

16
推荐指数
3
解决办法
675
查看次数

具有命名参数的函数指针?

我最近在C程序中遇到了一个奇怪的语法。

struct connector_agent_api{
    bool (*receive)(slot *s, uint8_t *data, uint8_t length);
}
Run Code Online (Sandbox Code Playgroud)

“接收”是一个函数指针吗?

如果它是一个函数指针,为什么它有命名参数?应该是下面的样子吗?

bool (*receive)(slot *, uint8_t *, uint8_t);
Run Code Online (Sandbox Code Playgroud)

它当然可以编译并在库中使用。我在互联网上进行了大量搜索,并试图证明这种语法的合理性。我仍然不知道为什么这个东西可以编译... :(

c pointers function

16
推荐指数
2
解决办法
643
查看次数

是否无法手动调用C++运算符?

我正在尝试更仔细地理解C++中的运算符.

我知道C++中的运算符基本上只是函数.我没有得到的是,该功能是什么样的?

举个例子:

int x = 1;
int y = 2;
int z = x + y;
Run Code Online (Sandbox Code Playgroud)

最后一行如何翻译?是吗:

1. int z = operator+(x,y);

要么

2. int z = x.operator+(y);

当我尝试了它们时,编译错误.我称他们是错的还是不允许直接调用C++中的运算符?

c++ operator-keyword

15
推荐指数
3
解决办法
7551
查看次数

如何在C中找到argv []的长度

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]){
    int fir; //badly named loop variable
    char *input[] = calloc( strlen(argv), sizeof(char)); //initializing an array
    for( fir = 1; fir< strlen(argv); fir++){ //removing the first element of argv
        strcat(input, argv[fir]); // appending to input
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是第7行.它说"从不兼容的指针类型传递'strlen'的参数1".我得到了相同的错误strcat功能.对于这两种功能,它也说"给出了一个char **但是预期的const char *".

我正在尝试使用argv除第一个之外的所有元素填充新数组.我试过了argv = &argv[1],但没用.

这些strlen()strcat()函数不采用char数组吗?

c strlen argv strcat

15
推荐指数
2
解决办法
5万
查看次数

bash脚本中$ @和$*之间的差异

下面有4个bash片段.我打电话给他们./script.sh a b c

for arg in $@; do 
echo "$arg"
done   ## output "a\nb\nc"

for arg in "$@"; do
echo "$arg"
done  ## output "a\nb\nc" -- I don't know why

for arg in $*; do
echo "$arg"
done  ##    output "a\nb\nc"

for arg in "$*"; do
echo "$arg"
done    ## output "abc"
Run Code Online (Sandbox Code Playgroud)

我不知道什么是之间准确的区别$@$*,
我想"$@""$*"应该是一样的,但事实并非如此.为什么?

linux bash shell

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

数字的绝对值

我想通过bash中的以下代码取一个数字的绝对值:

#!/bin/bash
echo "Enter the first file name: "
read first

echo "Enter the second file name: "
read second

s1=$(stat --format=%s "$first")
s2=$(stat -c '%s' "$second")

res= expr $s2 - $s1

if [ "$res" -lt 0 ]
then
        res=$res \* -1
fi

echo $res
Run Code Online (Sandbox Code Playgroud)

现在我遇到的问题是在if语句中,无论我改变什么,它总是在if中,我试图放置[[ ]]声明但没有.

这是错误:

./p6.sh: line 13: [: : integer expression expected
Run Code Online (Sandbox Code Playgroud)

unix bash shell

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

Try-catch-finally执行顺序似乎是随机的

我试图了解try-catch-finally执行流程的工作原理.Stack Overflow用户有一些关于其执行流程的解决方案.

一个这样的例子是:

try {
    // ... some code: A
} 
catch(...) {
    // ... exception code: B
} 
finally {
    // finally code: C
}
Run Code Online (Sandbox Code Playgroud)

代码A将被执行.如果一切顺利(即在执行A时没有异常被抛出),它将会转到finally,因此代码C将被执行.如果在执行A时抛出异常,那么它将转到B然后最终转到C.

但是,当我尝试时,我得到了不同的执行流程:

try {
    int a=4;
    int b=0;
    int c=a/b;
}
catch (Exception ex)
{
    ex.printStackTrace();
}
finally {
    System.out.println("common");
}
Run Code Online (Sandbox Code Playgroud)

我得到两个不同的输出:

第一输出:

java.lang.ArithmeticException: / by zero
at substrings.main(substrings.java:15)
lication.AppMain.main(AppMain.java:140)
common
Run Code Online (Sandbox Code Playgroud)

但是,当我第二次运行相同的程序时:

第二输出:

 common
    java.lang.ArithmeticException: / by zero
    at substrings.main(substrings.java:15)
Run Code Online (Sandbox Code Playgroud)

我应该从中得出什么结论?它是随机的吗?

java exception-handling exception

15
推荐指数
2
解决办法
1199
查看次数

用新的位置覆盖内存中的对象

我有一个要“转换”为另一个对象的对象。为此,我placement new在第一个对象上使用了一个,该对象在其自身地址的顶部创建了另一种类型的新对象。

考虑以下代码:

#include <string>
#include <iostream>

class Animal {
public:
  virtual void voice() = 0;
  virtual void transform(void *animal) = 0;
  virtual ~Animal() = default;;
};

class Cat : public Animal {
public:
  std::string name = "CAT";
  void voice() override {
    std::cout << "MEOW I am a " << name << std::endl;
  }
  void transform(void *animal) override {
  }
};

class Dog : public Animal {
public:
  std::string name = "DOG";
  void voice() override {
    std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ placement-new

15
推荐指数
3
解决办法
1099
查看次数

如何在不执行的情况下编辑当前的 shell 命令?

似乎有很多关于如何使用编辑器使用“edit-and-execute-command (Cx Ce)”编辑和执行命令的信息,但我想要实现的是获取当前的 shell 命令,应用某些过滤(使用脚本),然后在执行前返回它以提示进一步批准/手动更改。这可以用 bash 吗?

bash

15
推荐指数
2
解决办法
2269
查看次数