- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
能够将传递给文字运算符的字符串转换为 MPL 序列会很有用,因为这样我们就可以根据字符串的内容控制代码生成。以前,我认为这是不可能的,因为 constexpr 函数的参数在函数体内不被视为常量表达式。但是,我想出了以下在 Clang 3.4.2 和 GCC 4.8.2 下编译的解决方法:
#include <cstdint>
#include <iostream>
#include <typeinfo>
struct string
{
const uintmax_t m_str[64];
const size_t m_length;
template <class... Ts>
constexpr string(const Ts... ts) :
m_str{(uintmax_t)ts...}, m_length{sizeof...(Ts)} {}
constexpr size_t size() const { return m_length; }
constexpr size_t length() const { return m_length; }
constexpr uintmax_t operator[](size_t n) const { return m_str[n]; }
};
template <uintmax_t... Ts> struct sequence {};
constexpr auto
operator"" _tag(const char* str, size_t n)
{
return n == 0 ? string{} :
n == 1 ? string{str[0]} :
n == 2 ? string{str[0], str[1]} :
n == 3 ? string{str[0], str[1], str[2]} :
n == 4 ? string{str[0], str[1], str[2], str[3]} :
n == 5 ? string{str[0], str[1], str[2], str[3], str[4]} :
string{str[0], str[1], str[2], str[3], str[4], str[5]};
}
int main()
{
static constexpr auto string = "Hello!"_tag;
using sequence = sequence<string[0], string[1], string[2], string[3], string[4], string[5]>;
std::cout << typeid(sequence{}).name() << std::endl;
}
输出:
sequence<72ul, 101ul, 108ul, 108ul, 111ul, 33ul>
这段代码是否调用了未定义的行为,或者它是否合法?
最佳答案
这是正确的。除非必要,否则条件运算符不会评估操作数。
不过你做的太复杂了。尝试使用 string literal operator templates (Clang 和 GCC 都支持)。它们最初是为 C++1Y 计划的——尽管该提议被拒绝了(不知道为什么,它是由 Richard Smith 完成的,并且该功能是必不可少的)。
如果这不够便携(因为它现在只是编译器扩展),您可以使用二进制递归宏和 rtrim
类模板,例如 VTMPL :
# define VTMPL_SPLIT_1(s, x) ( x < sizeof(s) ? s[x] : decltype(*s)() )
# define VTMPL_SPLIT_4(s, x) VTMPL_SPLIT_1 (s, x), VTMPL_SPLIT_1 (s, x+1) , VTMPL_SPLIT_1 (s, x+2) , VTMPL_SPLIT_1 (s, x+3)
# define VTMPL_SPLIT_16(s, x) VTMPL_SPLIT_4 (s, x), VTMPL_SPLIT_4 (s, x+4) , VTMPL_SPLIT_4 (s, x+8) , VTMPL_SPLIT_4 (s, x+12)
# define VTMPL_SPLIT_64(s, x) VTMPL_SPLIT_16 (s, x), VTMPL_SPLIT_16 (s, x+16) , VTMPL_SPLIT_16 (s, x+32) , VTMPL_SPLIT_16 (s, x+48)
# define VTMPL_SPLIT_256(s, x) VTMPL_SPLIT_64 (s, x), VTMPL_SPLIT_64 (s, x+64) , VTMPL_SPLIT_64 (s, x+128), VTMPL_SPLIT_64 (s, x+194)
# define VTMPL_SPLIT_1024(s, x) VTMPL_SPLIT_256(s, x), VTMPL_SPLIT_256(s, x+256), VTMPL_SPLIT_256(s, x+512), VTMPL_SPLIT_256(s, x+768)
# define VTMPL_STRING_IMPL(str, n) vtmpl::rtrim<vtmpl::string<VTMPL_SPLIT_##n(str, 0)>>::type
# define VTMPL_STRING(str) VTMPL_STRING_IMPL(str, 64)
# define VTMPL_STRING_256(str) VTMPL_STRING_IMPL(str, 256)
# define VTMPL_STRING_1024(str) VTMPL_STRING_IMPL(str, 1024)
关于c++ - MPL 序列 : is this legal? 的用户定义文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25701846/
我经常听到有人这样说 All JavaScript code is legal TypeScript code 或 TypeScript is a superset of JavaScript 但是当
如果为对象预留内存(例如,通过 union )但构造函数尚未被调用,调用对象的非静态方法之一是否合法,假设该方法不依赖于值任何成员变量? 我做了一些研究,发现了一些关于“变体成员”的信息,但找不到与此
更新! 请参阅下面我对 C# 规范的一部分的剖析;我想我一定遗漏了什么,因为对我来说,我在这个问题中描述的行为实际上违反了规范。 更新2! 好的,经过进一步思考,并根据一些评论,我想我现在明白发生了什
我有代码: #include template class> struct Foo { enum { n = 77 }; }; template class C> struct Foo {
int ar[] = { 1, 2, 3, }; 这段代码合法吗? (我的意图是) int ar[] = { 1, 2, 3 }; 最佳答案 是的,C89 和 GNU89 中的初始化列表中都允许使用杂
我有一个 map View 被以下代码剪裁成一个圆圈。 roundMapView.layer.cornerRadius = roundMapView.frame.size.width/2
这个问题已经存在: Why sizeof(x++) does not increment the variable x value [duplicate] 关闭 9 年前。 给定以下代码,它在 C
在深入研究 MFC 时,我发现了这段代码: _AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL
我正在使用 MKMapSnapshotter 创建一个小型 MKMapView 的 UIImage 屏幕截图(并存储以备后用)。但我注意到的一件事是它从快照中删除了“合法”标签。 Here答案是删除“
在这个公认的人为设计的示例中,X 类型的右值在语句末尾按预期被销毁。但是,被销毁的对象仍然可以通过非常量引用“x”访问。这是合法的 C++ 吗?如果是这样,结果是未定义的还是未指定的?编译器不应该在这
这是一段显然不起作用的代码,因为在构造函数中向下转换“this”是非法的: #include class A { protected: virtual ~A() {} public:
考虑以下语句: int *pFarr, *pVarr; int farr[3] = {11,22,33}; int varr[3] = {7,8,9}; pFarr = &(farr
似乎只有向上滑动才能移除带动画的导航栏。我想让它褪色,就像在 Photos.app 中一样。 更改 alpha 最简单,但是 Apple's guidelines state : Prior to i
考虑一下这个相当无用的程序: #include int main(int argc, char* argv[]) { int a = 5; auto it = [&](auto self)
我添加了一个 MKMapView作为 XIB 中我的一个 ViewController 的 subview 。该 map 在显示方向方面工作正常。但是 Legal map 上的文字(左下)显示为 而不
这个问题在这里已经有了答案: JavaScript ternary operator example with functions (6 个答案) Ternary operators in Java
我有两个类如下。 class NeuroShield { public: NeuroShield(); uint16_t begin(); void setNcr(uint16
能够将传递给文字运算符的字符串转换为 MPL 序列会很有用,因为这样我们就可以根据字符串的内容控制代码生成。以前,我认为这是不可能的,因为 constexpr 函数的参数在函数体内不被视为常量表达式。
这是一个有点深奥的问题,但我很好奇以下类扩展模式在现代 C++ 中是否合法(例如,不构成 UB)(出于所有意图和目的,我可以将讨论限制在 C+ +17 及更高版本)。 template struct
我正在使用 MagicalRecord, 这就是我设置 coreData 堆栈的方式 - (BOOL)application:(UIApplication *)application didFinis
我是一名优秀的程序员,十分优秀!