我想写一个简单的加法器(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()仅适用于非可变参数声明吗?如果是这样的话,你会怎么写这样的功能?
我想我非常理解如何将关键字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";
还是还有别的什么?
是否可以使用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用来替换这些类型的宏.
在下面的代码中,我正在尝试构建一个类型的网格.例如,在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) 我正在尝试连接两个编译时字符串:
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++ 中是否有一种现代、简单的方法可以做到这一点?
我正在探索从这个答案中获取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) 以下代码在编译期间初始化两个 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)