我有一个Perl模块,我已经声明了一些常量:
use constant BASE_PATH => "/data/monitor/";
Run Code Online (Sandbox Code Playgroud)
在实时操作中,常量永远不会改变,但我希望能够在单元测试中修改它,例如将其设置为〜/ project/testdata /.有没有办法做到这一点,而不必使用"非常数"?
我可以在constant.pm上使用Test :: MockObject吗?
假设我们有以下模板类
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
作为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)
请参阅GCC和Clang消息.我怀疑这是两个编译器中的错误,因为我希望它们在这种情况下可以互换,但我很高兴被证明是错误的.:-)
传递给类模板时:
template<int N> struct X{};
X<0>      x1; //ok
X<int{}> …Run Code Online (Sandbox Code Playgroud)以下面的 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) 我正在探索从这个答案中获取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) 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 参数c0、c1等是编译时常量,应该以这样的方式处理:每当使用不同的cNumba 值调用函数时,都应该创建和编译一个单独的函数实例并进行必要的优化,就像C++生成一样当传递新的模板参数集时,模板化函数的每次实例化。
换句话说,这些常量的可能值c应该包含在函数的签名中,据我了解,Numba 会为每个不同的签名生成单独的函数代码,就像 C++ 模板一样。
另一种需要优化的情况是,whenc不是函数的参数,而是循环开始之前某些复杂表达式计算的结果。在这种情况下,结果c …
我正在尝试制作一个与此类似的功能
pub const fn insert(num1:i32, num2:i32) -> &'static str { 
    formatcp!("n1:{}, n2:{}" , num1, num2) 
} 
Run Code Online (Sandbox Code Playgroud)
但 num1/num2 不是 const。我认为这作为宏是可能的,但我在宏方面没有经验。
我们刚刚在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)
哪个也永远不会解决...但在这种情况下,编译器可以轻松地告诉它们是常量.它是否优化或汇总不可空的比较?
我有以下几种类型
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)
我得到一个编译时错误,说:
这不是有效的常量表达式或自定义属性值
我无法弄清楚这里有什么问题.