标签: compile-time-constant

有没有办法在单元测试中覆盖Perl"使用常量"?

我有一个Perl模块,我已经声明了一些常量:

use constant BASE_PATH => "/data/monitor/";
Run Code Online (Sandbox Code Playgroud)

在实时操作中,常量永远不会改变,但我希望能够在单元测试中修改它,例如将其设置为〜/ project/testdata /.有没有办法做到这一点,而不必使用"非常数"?

我可以在constant.pm上使用Test :: MockObject吗?

perl unit-testing constants mocking compile-time-constant

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

帮助类型特征

假设我们有以下模板类

template<typename T> class Wrap { /* ... */ };
Run Code Online (Sandbox Code Playgroud)

我们无法改变 Wrap.这很重要.

让我们有来自的类Wrap<T>.例如,

class NewInt  : public Wrap<int>     { /* ... */ };
class MyClass : public Wrap<myclass> { /* ... */ };
class Foo     : public Wrap<Bar>     { /* ... */ };
Run Code Online (Sandbox Code Playgroud)

我们也不能改变这些类.以上所有课程均为第三方.他们不是我的.

我需要以下编译时间type_traits:

template<class T>
struct is_derived_from_Wrap { 
     static const bool value = /* */;
};
Run Code Online (Sandbox Code Playgroud)

我需要什么?

assert(is_derived_from_Wrap<Int>::value == true);  // Indeed I need static assert
assert(is_derived_from_Wrap<MyClass>::value == true);
assert(is_derived_from_Wrap<char>::value …
Run Code Online (Sandbox Code Playgroud)

c++ templates specialization compile-time-constant type-traits

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

0,int()和int {}之间有什么区别?

作为int()并且int{}是值的等价的常量表达式0,我认为它们是等价且可互换的,因此编译器必须平等对待它们.例如,

 int a[0];      //error: zero-sized array not allowed in ISO C++
 int b[int()];  //error: zero-sized array not allowed in ISO C++
 int c[int{}];  //error: zero-sized array not allowed in ISO C++
Run Code Online (Sandbox Code Playgroud)

但似乎存在一些不可互换的极端情况.

  • 初始化指针时:

    int *p = 0;     //ok
    int *q = int(); //error - by clang only
    int *r = int{}; //error - by gcc and clang both
    
    Run Code Online (Sandbox Code Playgroud)

    请参阅GCCClang消息.我怀疑这是两个编译器中的错误,因为我希望它们在这种情况下可以互换,但我很高兴被证明是错误的.:-)

  • 传递给类模板时:

    template<int N> struct X{};
    
    X<0>      x1; //ok
    X<int{}> …
    Run Code Online (Sandbox Code Playgroud)

c++ gcc clang zero compile-time-constant

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

const和constexpr最终会是同一个东西吗?

我刚刚读了答案

const vs constexpr关于变量

我正在观看关于C++ 11/14 功能的谷歌技术讲座,其中有人说,在功能方面,未来可能不需要constexpr,因为编译器会逐步发现它们自己解决问题.最后,我知道Java编译器和JVM很难弄清楚类(或任何变量)在构造之后是不可变的 - 没有你明确地这么说 - 并且基于这个事实进行各种恶意优化.

所以,这里有一个问题:const和constexpr的命运最终会是同一个东西吗?也就是说,即使编译器不能保证进行运行时初始化等,它最终也不会这样做(基本上)吗?当发生这种情况时,其中一个关键字不会是多余的吗?(就像内联正在变成,也许)?

c++ const compile-time-constant constexpr c++11

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

为什么在增加 -fconstexpr-steps 后无法解析常量表达式?

以下面的 constexpr 为例:

#include <iostream>

constexpr int fib(const int i)
{
  if (i == 0) return 0;
  if (i == 1) return 1;
  return fib(i-1) + fib(i-2);
}

int main(){
  std::cout << fib(45) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

尽管是 constexpr,但它不会在编译时进行评估。
我学到的强制编译时评估的技巧如下:

#include <iostream>
#include <type_traits>

#define COMPILATION_EVAL(e) (std::integral_constant<decltype(e), e>::value)

constexpr int fib(const int i)
{
  if (i == 0) return 0;
  if (i == 1) return 1;
  return fib(i-1) + fib(i-2);
}

int main(){
  std::cout << COMPILATION_EVAL(fib(45)) << '\n';
} …
Run Code Online (Sandbox Code Playgroud)

c++ compile-time-constant constexpr clang++ c++17

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

constexpr c字符串连接,constexpr上下文中使用的参数

我正在探索从这个答案中获取constexpr char const*连接的程度: constexpr连接两个或多个char字符串

我有以下用户代码,准确显示我正在尝试做什么.似乎编译器无法看到函数参数(a和b)作为constexpr传入.

任何人都可以看到一种方法,使我指示的两个不在下面工作,实际工作?能够通过这样的函数组合字符数组是非常方便的.

template<typename A, typename B>
constexpr auto
test1(A a, B b)
{
  return concat(a, b);
}

constexpr auto
test2(char const* a, char const* b)
{
  return concat(a, b);
}

int main()
{
  {
    // works
    auto constexpr text = concat("hi", " ", "there!");
    std::cout << text.data();
  }
  {
    // doesn't work
    auto constexpr text = test1("uh", " oh");
    std::cout << text.data();
  }
  {
    // doesn't work
    auto constexpr text = test2("uh", " oh");
    std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ compile-time-constant c++11

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

Numba - 编译时间常数优化

我有使用Numba进行JIT编辑的人工示例代码:

import numba
@numba.njit
def f(x, c):
    for i in range(3):
        if c == 0:
            x += 1
        elif c == 1:
            x *= 2
        else:
            assert False
    return x
print(f(3, 0), f(3, 1))
Run Code Online (Sandbox Code Playgroud)

c如果是来自小的最终整数值集的某个常数,例如,如何优化它0 <= c <= 3

不允许将if有关条件c移出循环,因为这将是一个明显的优化。因为它是一个人为的示例,所以在实际示例中,循环可能会很大,并且仅更改主体内部的 1-2 行即可重复循环两次是负担不起的。

基本上我想让c编译时保持不变。与C++一样,可以将编译时常量作为模板参数,并执行与此相关的所有代码优化。

所以我想告诉 Numba 参数c0c1等是编译时常量,应该以这样的方式处理:每当使用不同的cNumba 值调用函数时,都应该创建和编译一个单独的函数实例并进行必要的优化,就像C++生成一样当传递新的模板参数集时,模板化函数的每次实例化。

换句话说,这些常量的可能值c应该包含在函数的签名中,据我了解,Numba 会为每个不同的签名生成单独的函数代码,就像 C++ 模板一样。

另一种需要优化的情况是,whenc不是函数的参数,而是循环开始之前某些复杂表达式计算的结果。在这种情况下,结果c …

python optimization templates compile-time-constant numba

5
推荐指数
0
解决办法
313
查看次数

在 const 函数中插入字符串

我正在尝试制作一个与此类似的功能

pub const fn insert(num1:i32, num2:i32) -> &'static str { 
    formatcp!("n1:{}, n2:{}" , num1, num2) 
} 

Run Code Online (Sandbox Code Playgroud)

但 num1/num2 不是 const。我认为这作为宏是可能的,但我在宏方面没有经验。

compile-time-constant string-interpolation rust

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

C#visual studio编译器如何处理struct/NULL比较?

我们刚刚在c#.net 4代码库中遇到了一些这样的错误代码

DateTime myDate = someValue;
If (myDate==Null)
    Do Something
Run Code Online (Sandbox Code Playgroud)

我们发现这种情况永远不会发生.

编译器如何处理这些不可为空的结构比较?

最初我们感到惊讶的是它会编译......但是在你可以肯定有一个恒定的比较的点上合理化它:

If(1==2)
Run Code Online (Sandbox Code Playgroud)

哪个也永远不会解决...但在这种情况下,编译器可以轻松地告诉它们是常量.它是否优化或汇总不可空的比较?

c# compiler-construction null struct compile-time-constant

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

无法在F#中创建列表文字

我有以下几种类型

type StatusCode = 
    | OK          = 200
    | NoContent   = 204
    | MovedTemp   = 301
    | MovedPerm   = 302
    | SeeOther    = 303
    | NotModified = 304
    | NotFound    = 404
    | ServerError = 500

[<Literal>]
let NoBodyAllowedStatusCodes = [StatusCode.NoContent; StatusCode.NotModified]
Run Code Online (Sandbox Code Playgroud)

我得到一个编译时错误,说:

这不是有效的常量表达式或自定义属性值

我无法弄清楚这里有什么问题.

f# compile-time-constant constant-expression

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