相关疑难解决方法(0)

在C++中方便地声明编译时字符串

能够在C++编译时创建和操作字符串有几个有用的应用程序.尽管可以在C++中创建编译时字符串,但是该过程非常麻烦,因为字符串需要声明为可变字符序列,例如

using str = sequence<'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!'>;
Run Code Online (Sandbox Code Playgroud)

诸如字符串连接,子字符串提取等许多操作可以很容易地实现为对字符序列的操作.是否可以更方便地声明编译时字符串?如果没有,是否有一个提案可以方便地声明编译时字符串?

为什么现有方法失败

理想情况下,我们希望能够如下声明编译时字符串:

// Approach 1
using str1 = sequence<"Hello, world!">;
Run Code Online (Sandbox Code Playgroud)

或者,使用用户定义的文字,

// Approach 2
constexpr auto str2 = "Hello, world!"_s;
Run Code Online (Sandbox Code Playgroud)

哪里decltype(str2)有一个constexpr构造函数.方法1的混乱版本可以实现,利用您可以执行以下操作的事实:

template <unsigned Size, const char Array[Size]>
struct foo;
Run Code Online (Sandbox Code Playgroud)

但是,数组需要有外部链接,所以要使方法1起作用,我们必须编写如下内容:

/* Implementation of array to sequence goes here. */

constexpr const char str[] = "Hello, world!";

int main()
{
    using s = string<13, str>;
    return 0; …
Run Code Online (Sandbox Code Playgroud)

c++ string metaprogramming user-defined-literals c++11

131
推荐指数
8
解决办法
6万
查看次数

什么是C++ iostream endl惨败?

我正在听Andrei Alexandrescu关于D编程语言的谷歌谈话,当时他抛出一个关于"endl"惨败的内线.我只是认为endl是表示行结束并刷新流缓冲区的首选方式.为什么它被视为惨败?我不应该在我的代码中使用它吗?

c++ iostream endl

52
推荐指数
1
解决办法
9629
查看次数

c ++ 11 constexpr将std :: array的列表展平为数组

我开始使用c ++ 11,constexpr和模板元编程似乎是一种在微型微控制器上保存稀缺内存的好方法.

有没有办法编写模板来展平constexpr数组列表,我需要的是一种方法:

constexpr std::array<int, 3> a1 = {1,2,3};
constexpr std::array<int, 2> a2 = {4,5};
constexpr auto a3 = make_flattened_array (a1,a2);
Run Code Online (Sandbox Code Playgroud)

我使用gcc 4.8.4(arm-none-eabi),如果需要,可以使用std = c ++ 11或c ++ 1y选项进行编译.

c++ arrays std constexpr c++11

19
推荐指数
2
解决办法
5374
查看次数

查找表与constexpr

我正在寻找创建一个坐标查找表,如:

int a[n][2] = {{0,1},{2,3}, ... }
Run Code Online (Sandbox Code Playgroud)

对于给定的n,在编译时创建.我开始研究constexpr,但似乎是一个函数返回a constexpr std::vector<std::array <int, 2> >不是一个选项,因为我得到:

invalid return type 'std::vector<std::array<int, 2ul> >' of constexpr function
Run Code Online (Sandbox Code Playgroud)

如何创建这样的编译时数组?

c++ constexpr c++11

12
推荐指数
2
解决办法
9153
查看次数

constexpr连接两个或多个char字符串

我正在尝试创建一个constexpr函数,它将连接Xeo的以下答案来连接任意数量的char数组,它连接两个char数组.

/sf/answers/930612091/

#include <array>

template<unsigned... Is> struct seq{};
template<unsigned N, unsigned... Is>
struct gen_seq : gen_seq<N-1, N-1, Is...>{};
template<unsigned... Is>
struct gen_seq<0, Is...> : seq<Is...>{};

template<unsigned N1, unsigned... I1, unsigned N2, unsigned... I2>
constexpr std::array<char const, N1+N2-1> concat(char const (&a1)[N1], char const (&a2)[N2], seq<I1...>, seq<I2...>){
  return {{ a1[I1]..., a2[I2]... }};
}

template<unsigned N1, unsigned N2>
constexpr std::array<char const, N1+N2-1> concat(char const (&a1)[N1], char const (&a2)[N2]){
  return concat(a1, a2, gen_seq<N1-1>{}, gen_seq<N2>{});
}
Run Code Online (Sandbox Code Playgroud)

我到目前为止的尝试:

#include <iostream>
#include <array>

template<unsigned... Is> struct seq{}; …
Run Code Online (Sandbox Code Playgroud)

c++ templates constexpr c++11

11
推荐指数
2
解决办法
5010
查看次数

使用constexpr编译时间字符串连接

#include <iostream>
#include <string>

constexpr std::string appendStringC(std::string s)
{
    return s + " Constexpr func";
}

std::string appendString(std::string s)
{
    return s + " Regular func";
}

int main()
{
    std::string s1 = "String 1";
    std::string s2 = "String 2";
    std::cout << std::endl
              << appendStringC(s1) << std::endl
              << appendString(s2) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用constexpr执行编译时字符串前缀/后缀连接操作.但是,此示例产生以下错误:

const_string_generation.cpp: In function ‘constexpr std::__cxx11::string appendStringC(std::__cxx11::string)’:
const_string_generation.cpp:4:23: error: invalid type for parameter 1 of constexpr function ‘constexpr std::__cxx11::string appendStringC(std::__cxx11::string)’
 constexpr std::string appendStringC(std::string s)
                       ^
In …
Run Code Online (Sandbox Code Playgroud)

c++ string

6
推荐指数
1
解决办法
1466
查看次数

如何在编译期间将 const 字符串初始化为两个字符串的串联?

以下代码在编译期间初始化两个 const 字符串:

class Test
{
public:
    static constexpr const char* LOS = "Los ";
    static constexpr const char* ANGELES = "Angeles";
};
Run Code Online (Sandbox Code Playgroud)

如何创建另一个常量字符串(const char*const std::string)作为两个常量字符串的串联?添加以下行

static constexpr const std::string LOS_ANGELES = std::string(LOS).append(ANGELES);
Run Code Online (Sandbox Code Playgroud)

发出错误:

error: the type ‘const string {aka const std::basic_string<char>}’ of constexpr variable ‘Test::LOS_ANGELES’ is not literal
Run Code Online (Sandbox Code Playgroud)

c++ string constexpr c++11

-1
推荐指数
1
解决办法
1777
查看次数

如何将const char*附加到const char*

我试图将三个不同的const char*变量附加到一个变量中.这是因为来自windows库的函数采用参数LPCTSTR.我有以下代码:

const char* path = "C:\\Users\\xxx\\Desktop\\";
const char* archivo = "vectors";
const char* extension = ".txt";

const char* fullPath =+ path;
fullPath =+ archivo;
fullPath =+ extension;
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我只获得添加到FullPath的最后一个(扩展名).

c++

-1
推荐指数
1
解决办法
5167
查看次数