相关疑难解决方法(0)

以编译方式在C++中编译时创建静态数组

可以在编译时定义静态数组,如下所示:

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)
  1. 欢迎使用C++ 0x的解决方案
  2. 阵列可能非常大,几百个元素长
  3. 现在的数组只包含POD类型
  4. 还可以假设,以静态编译时兼容的方式预先知道阵列的大小.
  5. 解决方案必须是C++ (没有脚本,没有宏,没有pp或基于代码生成器的解决方案)

更新: Georg Fritzsche的解决方案非常棒,需要一些工作才能在msvc和intel编译器上进行编译,但这仍然是解决问题的一种非常有趣的方法.

c++ metaprogramming static-array

63
推荐指数
3
解决办法
3万
查看次数

Constexpr数学函数

从这个页面中可以看出,c ++ 11中的数学函数似乎都没有使用constexpr,而我相信所有这些函数都可以.所以这给我留下两个问题,一个是他们为什么选择不使函数constexpr.对于像sqrt我这样的函数来说,两个人可能会编写我自己的constexpr,但是像sin或cos这样的东西会比较棘手,所以它就在那里.

c++ cmath constexpr c++11

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

C++ 11:编译数组的时间计算

假设我有一些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)

c++ templates constexpr c++11

40
推荐指数
1
解决办法
8372
查看次数

在编译时使用Constexpr填充数组

我想使用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)

c++ templates constexpr c++11

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

调用函数对象时如何保证参数评估的顺序?

关于如何在使用std :: make_tuple时避免构造函数的未定义执行顺序的问题的答案导致了一个讨论,在此期间我了解到构造函数可以保证参数评估的顺序:使用braced-init-list命令保证从左到右:

T{ a, b, c }
Run Code Online (Sandbox Code Playgroud)

表达式a,bc,按给定的顺序进行评估.即使类型T只定义了普通的构造函数,也是如此.

显然,并非所有被调用的都是构造函数,有时候在调用函数时保证求值顺序会很好,但是没有像brace-argument-list这样的东西来调用函数,并且定义了对它们的参数的评估顺序.问题变成:构造函数的保证是否可以用于构建函数调用工具(" function_apply()"),并具有用于评估参数的排序保证?要求调用函数对象是可以接受的.

c++ c++11

18
推荐指数
2
解决办法
1894
查看次数

可以在C++ 14 constexpr函数中使用for循环实例化模板吗?

我一直在乱搞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 …

c++ constexpr c++14

16
推荐指数
1
解决办法
3231
查看次数

将整数存储为浮点数

假设我有一个API,只允许我存储浮点数或浮点数组.但是,我想在这里存储整数值.

我(粗略地)明白我对于2 ^ 23左右的直接投射非常好,但是如果我想要更高的话呢?有什么方法可以利用浮动的32位中的更多,并确保我会得到相同的数字?


为了澄清:

我正在用Pixar的PRMan(即RenderMan)对点云进行一些操作.我可以用C或C++编写链接来预编译点云API.PRMan绝不必使用我存储的这些内容; 在操作附加到点上的其他数据后,我只需要将它们完整地交还给我.

c c++ floating-point int

8
推荐指数
1
解决办法
3440
查看次数

如何将float变量赋值给unsigned int变量,bit image,而不是cast

我知道这是一个奇怪的事情,而且它不便携.但我有一个已分配的无符号整数数组,我偶尔想在其中"存储"一个浮点数.我不想转换浮点数或将其转换为最接近的等价的int; 我想将float的确切位图存储在unsigned int的已分配空间中,这样我以后可以将它作为float检索,并保留其原始的float值.

c++

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

泰勒系列扩展为constexpr

我正在尝试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)

c++ trigonometry taylor-series constexpr c++14

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

使用Pattern初始化`constexpr`数组

我想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++ templates template-meta-programming constexpr c++11

2
推荐指数
1
解决办法
1727
查看次数