小编Rya*_*ing的帖子

成员函数中的decltype(auto)忽略无效的body,decltype(expr)失败

我有一个简单的模板化包装结构,其成员函数调用.error()其模板类型的对象.

template <typename T>
struct Wrapper {
    T t;
    decltype(auto) f() {
        return t.error(); // calls .error()
    }
};
Run Code Online (Sandbox Code Playgroud)

如果我使用没有error()成员函数的类型实例化它,只要我不调用它就没问题.这是我想要的行为.

Wrapper<int> w; // no problem here
// w.error(); // uncommented causes compilation failure
Run Code Online (Sandbox Code Playgroud)

如果我使用我认为是跟踪返回类型的语义等价物,它就会在变量声明中出错

template <typename T>
struct Wrapper {
    T t;
    auto f() -> decltype(t.error()) {
        return t.error();
    }
};

Wrapper<int> w; // error here
Run Code Online (Sandbox Code Playgroud)

我会接受这两个语义在语义上是等价的,但无论如何都要使用尾随返回类型(仅限C++ 11)来获取前者的行为而不使用某种HasErrortmp技巧来专门化整个类?

c++ templates c++11 c++14

4
推荐指数
1
解决办法
225
查看次数

static_casting的结果是constexpr void*一个常量表达式吗?

clang拒绝了gcc允许的代码:

int main() {
    static constexpr const void *vp = nullptr;
    static constexpr const char *cp = static_cast<const char*>(vp);
}
Run Code Online (Sandbox Code Playgroud)

具有以下内容:

error: constexpr variable 'cp' must be initialized by a constant expression
  static constexpr const char *cp = static_cast<const char*>(vp);
Run Code Online (Sandbox Code Playgroud)

在阅读N3797 5.9/2中的最终列表后,我没有看到任何禁止static_cast在常量表达中使用的内容.我是在寻找错误的地方还是误读了什么?或者我应该打开一个反对clang的bug?

c++ clang language-lawyer constexpr c++14

4
推荐指数
1
解决办法
1478
查看次数

在命令行中指定 vim 文件类型

我一直在处理很多没有扩展名的 C++ 文件,:set ft=cpp每次打开它们时都必须输入太烦人了,所以我主要是在没有语法突出显示的情况下工作。有没有办法在命令行中告诉 vim 文件类型?就像是:

$ vim --ft=cpp file_name
Run Code Online (Sandbox Code Playgroud)

vim

4
推荐指数
1
解决办法
995
查看次数

Python 自定义模块名称未定义

我有一个名为“package”的自定义包和一个名为“module”的包中的自定义模块,它有一个函数在调用时返回“test”。当我导入我的包时,如果我这样做:

from package import module
Run Code Online (Sandbox Code Playgroud)

一切正常,但如果我这样做:

from package import *
Run Code Online (Sandbox Code Playgroud)

或者

import package
Run Code Online (Sandbox Code Playgroud)

然后当尝试使用“模块”模块时,它会出现一个错误名称“模块”未定义。为什么在使用 import * 或导入包时不导入模块?

我试图调用的模块中的代码是这样的:

def printTest():
    return("Test")
Run Code Online (Sandbox Code Playgroud)

调用模块的文件中的代码是这样的:

import package

print(module.printTest())
Run Code Online (Sandbox Code Playgroud)

python module package python-3.x

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

通过脚本src属性传递javascript参数

如果我有一个像javascript的src

<script src="http://domain.com/js/script.js"> 
Run Code Online (Sandbox Code Playgroud)

我可以在它的末尾添加更多的值

<script src="http://domain.com/js/script.js?state=1"> 
Run Code Online (Sandbox Code Playgroud)

并在javascript中获取状态?

这个想法来自一种情况,我必须得到客户端解决方案并将其保存到会话但我不能通过PHP,所以我必须通过JavaScript获取它,但我不想显示源代码中的脚本

我认为这是可能的,因为我看到很多消息来源确实有像这样的链接!

javascript

3
推荐指数
2
解决办法
9285
查看次数

float对象不可调用

我在Python代码中的while循环中有多个for循环.对于第一次迭代,一切正常.对于while循环的第二次迭代,我得到以下错误:

File ".\simulated_annealing.py", line 209, in <module>
 for ii in range(0, 8, 1) :
TypeError: 'float' object is not callable
Run Code Online (Sandbox Code Playgroud)

以下是我的代码的相关部分:

而numpy.absolute(FcostOld)> = 0.001且l <= L:

Fx = []
Fy = []
Fz = []
V = []
ii = 0  

for ii in range(0, 8, 1) :          # ... LINE 209
    Fx.append([])
    Fy.append([])
    Fz.append([])
    for j in range(0, 13, 1) :
        Fx[ii].append(0)
        Fy[ii].append(0)
        Fz[ii].append(0)
    V.append(0.0)   

print "\n l = ", l
j = 0
print "j = ", j …
Run Code Online (Sandbox Code Playgroud)

python numpy

3
推荐指数
2
解决办法
5513
查看次数

元组类型的模板重载(元组,对)

我试图提供相同模板化函数的两个版本,一个用于任何可以像a一样的tuple东西,也就是说,tuple_size和它一起使用的东西std::get.我不在乎它是否得到std::arrays,只要它得到元组和对.编写通用版本没有问题,但我似乎无法使用类似元组的版本.

// 1
template <typename T>
A func(T&& t) { /* ... */ }

// 2
template <typename TupleType,
          std::size_t Size=std::tuple_size<std::decay_t<TupleType>>::value>
B func(TupleType&& tup) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

用例子:

int main() {
    int i;
    std::vector<int> v;
    auto t = std::make_tuple(1, 2.0, 'a');
    auto p = std::make_tuple(1, 2.0);

    A a = func(i); // calls 1
    a = func(v); // calls 1

    B b = func(t); // ambiguous, should call 2
    b = …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++14

3
推荐指数
1
解决办法
263
查看次数

将const T(&ref)[N]绑定到类型为T [N]的对象

我注意到奇怪的语义wrt绑定对指针和数组的引用,这些指针和数组分别在指向和数组元素的常量上有所不同.使用指针,这可以预测失败:

int* p{};
const int*& p_ref{p};
Run Code Online (Sandbox Code Playgroud)

non-const lvalue reference to type 'const int *' cannot bind to a  value of unrelated type 'int *'
Run Code Online (Sandbox Code Playgroud)

有道理,指向int和指针指向const-int是两种不同的类型,const&允许编译器生成临时之前添加一个,这有效,但不会改变上述内容.

但是,我认为应该与数组类似的不是

int arr[5]{};
const int (&arr_ref)[5]{arr};
Run Code Online (Sandbox Code Playgroud)

clang和gcc都在没有抱怨的情况下编译上面的内容,但为什么呢?我将非const引用绑定const int[5]到类型的对象int[5].为什么允许这样做?

更新: Stephen C. Dewhurst 在C++ Gotchas中描述了类似的问题#32(第82页)

c++ arrays pointers reference c++11

3
推荐指数
1
解决办法
132
查看次数

在头文件中使用常量符合ODR

看看另一个问题,我意识到我不能通过头文件使用匿名命名空间中的对象或函数,因为它会在类定义或内联函数中导致ODR违规.如果是这种情况,那么是否可以安全地在函数或类中使用命名constconstexpr static对象inline?例如,如果CONSTANTnamespace下面,它将是不安全的,但是可以使用静态链接的常量吗?

// some header file to be included by multiple .cpp files
static const/*expr*/ int CONSTANT = 2;

inline int f() {
  return CONSTANT;
}

class Cls {
  int mem = CONSTANT;
};
Run Code Online (Sandbox Code Playgroud)

c++ one-definition-rule c++11

3
推荐指数
1
解决办法
393
查看次数

Python format()传递一个对象

如果我在Python中定义以下自定义类:

class Test:
    hey = 'ho'
    yo = 'go'
    fo = 'sho'
Run Code Online (Sandbox Code Playgroud)

有没有办法使用字符串format()方法只需要传入我的对象一次,然后在所有参数中访问它.理想情况下,我希望能够做到这样的事情:

test_class = Test()
print "Hey {0.hey}, let's {1.yo}. Fo' {2.sho}".format(test_class)
Run Code Online (Sandbox Code Playgroud)

但我必须这样做:

test_class = Test()
print "Hey {0.hey}, let's {1.yo}. Fo' {2.sho}".format(test_class, test_class, test_class)
Run Code Online (Sandbox Code Playgroud)

python format python-2.7

3
推荐指数
2
解决办法
73
查看次数