可以在编译时定义静态数组,如下所示:
const std::size_t size = 5;
unsigned int list[size] = { 1, 2, 3, 4, 5 };
Run Code Online (Sandbox Code Playgroud)
问题1 - 是否可以通过使用各种元编程技术在编译时"以编程方式"分配这些值?
问题2 - 假设数组中的所有值都是相同的barr,是否可以在编译时以编程方式选择性地分配值?
例如:
const std::size_t size = 7;
unsigned int list[size] = { 0, 0, 2, 3, 0, 0, 0 };
Run Code Online (Sandbox Code Playgroud)
更新: Georg Fritzsche的解决方案非常棒,需要一些工作才能在msvc和intel编译器上进行编译,但这仍然是解决问题的一种非常有趣的方法.
从这个页面中可以看出,c ++ 11中的数学函数似乎都没有使用constexpr,而我相信所有这些函数都可以.所以这给我留下两个问题,一个是他们为什么选择不使函数constexpr.对于像sqrt我这样的函数来说,两个人可能会编写我自己的constexpr,但是像sin或cos这样的东西会比较棘手,所以它就在那里.
假设我有一些constexpr函数f:
constexpr int f(int x) { ... }
Run Code Online (Sandbox Code Playgroud)
我在编译时知道一些const int N:
或
#define N ...;
Run Code Online (Sandbox Code Playgroud)
要么
const int N = ...;
Run Code Online (Sandbox Code Playgroud)
根据你的答案需要.
我想要一个int数组X:
int X[N] = { f(0), f(1), f(2), ..., f(N-1) }
Run Code Online (Sandbox Code Playgroud)
这样在编译时评估函数,X中的条目由编译器计算,结果放在我的应用程序映像的静态区域,就像我在X初始化列表中使用整数文字一样.
有什么方法可以写这个吗?(例如,使用模板或宏等)
我有最好的:(感谢Flexo)
#include <iostream>
#include <array>
using namespace std;
constexpr int N = 10;
constexpr int f(int x) { return x*2; }
typedef array<int, N> A;
template<int... i> constexpr A fs() { return A{{ f(i)... }}; }
template<int...> struct S;
template<int... i> struct S<0,i...>
{ static …Run Code Online (Sandbox Code Playgroud) 我想使用constexpr填充一个枚举数组.阵列的内容遵循某种模式.
我有一个枚举将ASCII字符集分为四类.
enum Type {
Alphabet,
Number,
Symbol,
Other,
};
constexpr Type table[128] = /* blah blah */;
Run Code Online (Sandbox Code Playgroud)
我想有一个128的数组Type.它们可以是一个结构.数组的索引将对应于ASCII字符,值将是Type每个字符的值.
所以我可以查询这个数组,找出ASCII字符属于哪个类别.就像是
char c = RandomFunction();
if (table[c] == Alphabet)
DoSomething();
Run Code Online (Sandbox Code Playgroud)
我想知道如果没有一些冗长的宏观黑客,这是否可行.
目前,我通过执行以下操作来初始化表.
constexpr bool IsAlphabet (char c) {
return ((c >= 0x41 && c <= 0x5A) ||
(c >= 0x61 && c <= 0x7A));
}
constexpr bool IsNumber (char c) { /* blah blah */ }
constexpr bool IsSymbol (char c) { /* blah blah */ } …Run Code Online (Sandbox Code Playgroud) 关于如何在使用std :: make_tuple时避免构造函数的未定义执行顺序的问题的答案导致了一个讨论,在此期间我了解到构造函数可以保证参数评估的顺序:使用braced-init-list命令保证从左到右:
T{ a, b, c }
Run Code Online (Sandbox Code Playgroud)
表达式a,b和c,按给定的顺序进行评估.即使类型T只定义了普通的构造函数,也是如此.
显然,并非所有被调用的都是构造函数,有时候在调用函数时保证求值顺序会很好,但是没有像brace-argument-list这样的东西来调用函数,并且定义了对它们的参数的评估顺序.问题变成:构造函数的保证是否可以用于构建函数调用工具(" function_apply()"),并具有用于评估参数的排序保证?要求调用函数对象是可以接受的.
我一直在乱搞SVN构建的clang来试验放松的规则constexpr.我之前无法确定的一件事是,是否可以在constexpr函数中在编译时循环遍历元组内的元素.
因为我没有要测试的符合C++ 14的标准库,所以我准备了以下等效测试:
template<int N>
constexpr int foo() {
return N;
}
constexpr int getSum() {
auto sum = 0;
for (auto i = 0; i < 10; ++i) {
sum += foo<i>();
}
return sum;
}
constexpr auto sum = getSum();
Run Code Online (Sandbox Code Playgroud)
这里有趣的部分是foo<i>().在非constexpr函数中,我希望它无法编译,因为您根本无法使用运行时int来生成模板的编译时实例化.constexpr但是,因为这是一个功能,我怀疑这是否可行.特别是,该值在编译时是已知的,即使它允许变异.
我知道以下代码将编译:
constexpr auto nValue = 2;
foo<nValue>();
Run Code Online (Sandbox Code Playgroud)
在SVN clang中,我的第一个例子没有:
test2.cpp:19:12: error: no matching function for call to 'foo'
sum += foo();
^~~~~~
test2.cpp:11:15: note: candidate template ignored: invalid explicitly-specified … 假设我有一个API,只允许我存储浮点数或浮点数组.但是,我想在这里存储整数值.
我(粗略地)明白我对于2 ^ 23左右的直接投射非常好,但是如果我想要更高的话呢?有什么方法可以利用浮动的32位中的更多,并确保我会得到相同的数字?
为了澄清:
我正在用Pixar的PRMan(即RenderMan)对点云进行一些操作.我可以用C或C++编写链接来预编译点云API.PRMan绝不必使用我存储的这些内容; 在操作附加到点上的其他数据后,我只需要将它们完整地交还给我.
我知道这是一个奇怪的事情,而且它不便携.但我有一个已分配的无符号整数数组,我偶尔想在其中"存储"一个浮点数.我不想转换浮点数或将其转换为最接近的等价的int; 我想将float的确切位图存储在unsigned int的已分配空间中,这样我以后可以将它作为float检索,并保留其原始的float值.
我正在尝试sine使用泰勒系列扩展构建一个简单的函数,可以在编译时使用C++ 14进行评估constexpr.我的代码正在编译,但编译器不会生成常量.
sine 定义如下:
template <int P, typename T = double> constexpr T sine(T x) {
T result = x;
for (int i = 1; i < P; ++i)
result += power<T>(-1, i) * power<T>(x, 1 + 2 * i) / factorial<T>(1 + 2 * i);
return result;
}
Run Code Online (Sandbox Code Playgroud)
我可以提供代码power,factorial如果需要的话.它们是微不足道的constexpr.
我sine在这样的循环中调用:
template <int N> void test(double *out) {
for (int i = 0; i < N; ++i) { …Run Code Online (Sandbox Code Playgroud) 我想constexpr用一个使用可变参数模板参数生成的模式初始化一个数组.为简单起见,请考虑使用constexpr unsigned类型列表的大小初始化静态数组的问题unsigned, short, char, int, long.我怎么能这样做所有的计算都是在编译期间完成的?我需要解决方案来使用C++类型系统,所以我不能使用宏.
我能想出的最好的结果如下所示,但是使用 并且工作正常.g++ -std=c++11 -Wall -Ofast -S(使用g ++ 4.7)进行编译并检查程序集清楚地表明在运行时将值压入堆栈.有任何想法吗?
如果我能以某种方式告诉扩展n + 1关于扩展n,那么使用如下的数组初始化器将起作用.
static constexpr unsigned foo[] = { compute_element<Args>::value... };
编辑:等等,没关系,我有一个脑力.上面这条线很好......
这是代码答案:
#include <iostream>
template <class... Args>
struct foo
{
static constexpr unsigned bar[] = { sizeof(Args)... };
};
int main()
{
std::cout << foo<unsigned, short, char, int, long>::bar[2] << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
非常感谢您的宝贵时间!
c++ ×10
constexpr ×6
c++11 ×5
templates ×3
c++14 ×2
c ×1
cmath ×1
int ×1
static-array ×1
trigonometry ×1