我有一个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
等是编译时常量,应该以这样的方式处理:每当使用不同的c
Numba 值调用函数时,都应该创建和编译一个单独的函数实例并进行必要的优化,就像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)
我得到一个编译时错误,说:
这不是有效的常量表达式或自定义属性值
我无法弄清楚这里有什么问题.