小编Dut*_*tow的帖子

在专门使用之前使用模板?

我发现如果您使用包装模板使用模板,您可以首次使用模板对其进行专门化.简单的例子:

#include <iostream>

template<typename T>
const char* templateImpl();

template<typename T>
const char* templateGetter() { return templateImpl<T>(); }

struct S{};

int main(){ std::cout << templateGetter<S>() << std::endl; return 0; }

template<>
const char* templateImpl<S>(){ return "S"; }
Run Code Online (Sandbox Code Playgroud)

这适用于每个编译器 - 我并不感到惊讶MSVC编译它,因为它处理模板的方式不同,但GCC和clang也允许它.我认为标准要求在第一次使用之前进行专门化,在这种情况下,这意味着在main之前并且期望它们报告错误.

我错过了什么,这个代码符合标准吗?

为了澄清,如果我改变templateGetter<S>templateImpl<S>主,程序将不会出现错误消息我期望从这一过于编译:

main.cpp:14:29:错误:实例化后'const char*templateImpl()[带T = S]'的特化

c++ templates

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

多线程X11应用程序和OpenGL

我正在尝试使用libx11创建一个多线程opengl应用程序 - 每个窗口有一个单独的线程,以及一个管理器线程.

我在经理线程中有一个事件循环:

while(true)
  while(XQLength(mPlatformData->display)){
    XNextEvent(mPlatformData->display, &event);
    std::cout << "event" << std::endl;
  }
}
Run Code Online (Sandbox Code Playgroud)

对于单线程应用程序来说,这是一个很棒的事件循环,但是使用这种多线程设置会发生奇怪的事情.

当我创建一个窗口时,我需要禁用事件队列,否则GLXMakeCurrent将挂起 - 我的整个线程停止,什么都不做.

我不能在网上找到有关多线程X11应用程序的更多信息,我应该以不同的方式处理我的事件吗?

x11 opengl multithreading thread-safety

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

C#和UTF-16字符

在C#中是否可以使用不在Plane 0中的UTF-32字符作为char?

string s = ""; // valid
char c = ''; // generates a compiler error ("Too many characters in character literal")
Run Code Online (Sandbox Code Playgroud)

在s中它由两个字符表示,而不是一个.

编辑:我的意思是,是否有一个字符AN字符串类型,每个字符支持完整的unicode,UTF-32或UTF-8?例如,如果我想在字符串中的utf-32(可能不在plane0中)字符上进行for循环.

c# unicode

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

转发声明的函数和 SFINAE

我在unconstexpr库中遇到了一个有趣的模式。

根据自述文件,这个想法是给定一个前向声明的自动返回类型函数,在实际定义函数之前不能推断返回类型,这允许一些 SFINAE 魔法。

我认为这个语言特性可能对其他一些想法有用,并用它做了一些实验,当函数不是模板时,看起来 gcc 和 clang 的行为不同:gcc 工作相同,而 clang 报告错误。

根据 clang 的错误消息显示的内容,也许它甚至不适用于模板?

所以问题是:

  • 标准是否允许模板部分(clang 和 gcc 都允许)?
  • 哪个编译器对非模板版本是正确的?

简化代码(也在Godbolt 上):

struct S {};

constexpr auto f1();

template <typename T>
constexpr auto f2(T);

// compilation error with clang:
// function with deduced return type cannot be used before it is defined
template <typename T, typename = decltype(f1())>
void test1_1() {}
template <typename T>
void test1_1() {}

// compiles with clang, even if f2 will …
Run Code Online (Sandbox Code Playgroud)

c++ sfinae c++17

5
推荐指数
0
解决办法
165
查看次数

互动式蚂蚁

我正在尝试使用antlr编写一种简单的交互式(使用System.in作为源代码)语言,但我遇到了一些问题。我在网上找到的示例都是按行周期使用的,例如:

while(readline)
  result = parse(line)
  doStuff(result)
Run Code Online (Sandbox Code Playgroud)

但是,如果我写的是pascal / smtp / etc之类的东西,并且带有“第一行”,看起来像X需求,该怎么办?我知道可以在doStuff中检查它,但是从逻辑上讲,它是语法的一部分。

还是将命令分成多行怎么办?我可以试试

while(readline)
  lines.add(line)
  try
    result = parse(lines)
    lines = []
    doStuff(result)
  catch
    nop
Run Code Online (Sandbox Code Playgroud)

但是与此同时,我也隐藏了真正的错误。

或者我可以每次重新分析所有行,但是:

  1. 会很慢
  2. 有些指令我不想运行两次

可以使用ANTLR完成此操作吗?

java parsing antlr

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

标签 统计

c++ ×2

antlr ×1

c# ×1

c++17 ×1

java ×1

multithreading ×1

opengl ×1

parsing ×1

sfinae ×1

templates ×1

thread-safety ×1

unicode ×1

x11 ×1