相关疑难解决方法(0)

C++模板Turing-complete?

我被告知C++中的模板系统在编译时是图灵完备的.这篇文章以及维基百科都提到了这一点.

你能提供一个利用这个属性的计算的重要例子吗?

这个事实在实践中有用吗?

c++ templates turing-complete template-meta-programming

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

使用具有可变参数模板函数的decltype的尾随返回类型

我想写一个简单的加法器(giggles),它将每个参数相加并返回一个具有适当类型的和.目前,我有这个:

#include <iostream>
using namespace std;

template <class T>
T sum(const T& in)
{
   return in;
}

template <class T, class... P>
auto sum(const T& t, const P&... p) -> decltype(t + sum(p...))
{
   return t + sum(p...);
}

int main()
{
   cout << sum(5, 10.0, 22.2) << endl;
}
Run Code Online (Sandbox Code Playgroud)

在GCC 4.5.1上,这似乎适用于2个参数,例如sum(2,5.5)返回7.5.但是,由于参数多于此,我得到的错误是sum()尚未定义.如果我这样声明sum():

template <class T, class P...>
T sum(const T& t, const P&... p);
Run Code Online (Sandbox Code Playgroud)

然后它适用于任意数量的参数,但sum(2,5.5)将返回整数7,这不是我所期望的.有两个以上的参数我假设decltype()必须进行某种递归才能推导出t + sum(p ...)的类型.这是合法的C++ 0x吗?或者decltype()仅适用于非可变参数声明吗?如果是这样的话,你会怎么写这样的功能?

c++ templates variadic-functions decltype c++11

38
推荐指数
3
解决办法
5626
查看次数

如何声明constexpr C字符串?

我想我非常理解如何将关键字constexpr用于简单的变量类型,但是当涉及到指向值的指针时,我感到很困惑.

我想声明一个constexpr C字符串文字,它的行为就像

#define my_str "hello"
Run Code Online (Sandbox Code Playgroud)

这意味着编译器将C字符串文字插入到我输入此符号的每个位置,并且我将能够在编译时使用sizeof获取其长度.

是吗 constexpr char * const my_str = "hello";

要么 const char * constexpr my_str = "hello";

要么 constexpr char my_str [] = "hello";

还是还有别的什么?

c++ c-strings string-literals constexpr

15
推荐指数
2
解决办法
8202
查看次数

Concat两个`const char`字符串文字

是否可以使用constexpr?连接两个字符串文字?或者换句话说,可以在代码中消除宏,如:

#define nl(str) str "\n"

int main()
{
  std::cout <<
      nl("usage: foo")
      nl("print a message")
      ;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

更新:使用没有任何问题"\n",但我想知道是否可以constexpr用来替换这些类型的宏.

c++ string-literals c-preprocessor constexpr c++11

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

C++ 11:重载无法解析递归的decltype

在下面的代码中,我正在尝试构建一个类型的网格.例如,在float和之间int,将结果推广到float:

float join(float f, int)   { return f; }
float join(float f, float) { return f; }
Run Code Online (Sandbox Code Playgroud)

然后我介绍一种wrapper类型:

template <typename Inner>
struct wrapper
{
  using inner_t = Inner;
  inner_t value;
};
Run Code Online (Sandbox Code Playgroud)

join操作行为很自然:

template <typename Inner1, typename Inner2>
auto
join(const wrapper<Inner1>& w1, const wrapper<Inner2>& w2)
  -> wrapper<decltype(join(w1.value, w2.value))>
{
  return {join(w1.value, w2.value)};
}
Run Code Online (Sandbox Code Playgroud)

它也可以join用"标量"类型编辑:

template <typename Inner1, typename T2>
auto
join(const wrapper<Inner1>& w1, const T2& value2)
  -> wrapper<decltype(join(w1.value, value2))> …
Run Code Online (Sandbox Code Playgroud)

c++ overloading decltype c++11 trailing-return-type

10
推荐指数
1
解决办法
578
查看次数

使用 C++11 在编译时组合两个字符串的最简单方法

我正在尝试连接两个编译时字符串:

constexpr const char* getString1() { return "abababa"; };
constexpr const char* getString2() { return "lalalal"; };
constexpr const char* getString3() { return getString1() + getString2(); }; //wont compile
Run Code Online (Sandbox Code Playgroud)

在 C++ 中是否有一种现代、简单的方法可以做到这一点?

c++

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

constexpr c字符串连接,constexpr上下文中使用的参数

我正在探索从这个答案中获取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)

c++ compile-time-constant c++11

5
推荐指数
1
解决办法
2099
查看次数

如何在编译期间将 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
查看次数