小编gig*_*tes的帖子

为什么我的特征模板类查找运算符<< for llvm :: StringRef?

下面的问题如何检测类型是否可以流式传输到std :: ostream?我写了一个trait类,说明某些类型是否可以流式传输到IO流.直到现在我发现了一个问题,这个特性似乎运作良好.

我在使用LLVM的项目中使用代码,我正在使用他们的StringRef类(它与提议的std :: string_view类似).是该类的Doxygen doc的链接,如果需要,您可以从中找到它的声明头文件.由于LLVM不提供运算符<<将StringRef对象流式传输到std流(它们使用自定义轻量级流类),因此我写了一个.

但是,当我使用特征时,如果我的自定义运算符<< 在特征之后被声明(这是因为我在一个标题中具有特征而操作符在另一个标题中的函数),则它不起作用.我曾经认为模板实例化中的查找是从实例化点的角度来看的,所以我认为它应该可行.实际上,正如你在下面看到的那样,使用另一个类及其自定义运算符<<,在特征之后声明,一切都按预期工作(这就是为什么我现在才发现这个问题),所以我无法弄清楚StringRef的原因特别.

这是完整的例子:

#include <iostream>

#include "llvm/ADT/StringRef.h"

// Trait class exactly from the cited question's accepted answer
template<typename T>
class is_streamable
{
   template<typename SS, typename TT>
   static auto test(int)
      -> decltype(std::declval<SS&>() << std::declval<TT>(),
                  std::true_type());

   template<typename, typename>
   static auto test(...) -> std::false_type;

public:
   static const bool value = decltype(test<std::ostream,T>(0))::value;
};

// Custom stream operator for StringRef, declared after the trait
inline std::ostream &operator<<(std::ostream &s, llvm::StringRef const&str) {
   return …
Run Code Online (Sandbox Code Playgroud)

c++ llvm type-traits c++11 llvm-c++-api

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

2:1平衡线性八叉树的算法是什么?

我有一个自上而下的过程,从3D对象的高级描述构建一个线性八叉树(例如,叶子排列在一个数组中并按莫顿编码排序).问题是,对于我的预期应用,得到的八叉树必须是2:1平衡,即不得有任何一对相邻的块,其中一个是另一个的两倍以上.

我唯一能找到的是文章"自下而上的构造和平行线性八分之一的2:1平衡"(你从多个来源找到它但版权不明确,不确定链接这样的东西的政策是什么这个网站),解释了这样做的算法.问题是所提出的算法在并行消息传递架构中工作,并且对我的应用程序来说太过分了.另一个问题是(自下而上)构造和平衡算法似乎捆绑在一起,我不知道如何在用我自己的方法构造树之后如何仅平衡它.

那么2:1平衡线性八叉树的(希望简单且有效)方法是什么?并行算法也很棒,但是使用共享内存模型,而不是传递链接算法之类的消息.

algorithm octree

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

建议一个有效的SAT求解器具有良好的C++接口(或者:Z3对我有用)?

对于我正在开始的项目,我将需要使用SAT求解器.我之前使用过其中一些但主要用于实验,而这里项目的主要约束是良好的性能.我正在尝试寻找替代方案,并尝试了解每种方案如何根据我的具体要求定位.特别是:

  1. 我需要提取令人满意的任务,不仅要检查是否满足,而且解算器应该允许我重复求解相同的公式,寻找不同的可能令人满意的任务,最终以有效的方式迭代所有这些,(例如,没有我)必须添加一个条款并重新开始).

  2. 该项目应该仍然是积极维护和相当的生产质量,而不是自出版以来放弃的一些竞争获胜的研究项目(见picosat).

  3. 此外,由于我使用的是C++,解算器应该提供一个高效且(可能)良好的编写C++接口.

我考虑的第一个候选人是Z3,但我对文档感到困惑,如果上面的第1点得到支持则无法理解,如果我只需要SAT而不是SMT就可能有点过分.C++界面似乎也很容易使用,但我无法忍受这样一个事实:我必须使用普通字符串命名变量(这与我周围的算法配对非常糟糕.这是不是可以避免?).

那么你能否给我一些关于哪个SAT求解器使用的建议,或者对Z3的怀疑有所启发?

c++ z3 sat

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

Haskell中这个循环链表上的"绑结"如何工作?

我正在学习Haskell,正在阅读Tying the Knot关于如何构建循环链表.在代码中

data DList a = DLNode (DList a) a (DList a)
mkDList :: [a] -> DList a
mkDList [] = error "must have at least one element"
mkDList xs = let (first,last) = go last xs first
         in  first
         where go :: DList a -> [a] -> DList a -> (DList a, DList a)
               go prev []     next = (next,prev)
               go prev (x:xs) next = let this        = DLNode prev x rest
                                         (rest,last) = go this …
Run Code Online (Sandbox Code Playgroud)

haskell lazy-evaluation

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

C++ 是否保证从两个线程访问数组的相邻元素是安全的

就 C++ 标准而言(我猜是 C++11 及更高版本,因为在没有考虑线程之前),并发写入数组的不同元素(可能是相邻元素)是否安全?

例如:

#include <iostream>
#include <thread>

int array[10];

void func(int i) {
   array[i] = 42;
}

int main() 
{
   for(int i = 0; i < 10; ++i) {
      // spawn func(i) on a separate thread
      // (e.g. with std::async, let me skip the details)
   }
   // join

   for(int i = 0; i < 10; ++i) {
      std::cout << array[i] << std::endl; // prints 42?
   }

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

在这种情况下,语言是否保证数组的不同元素的写入不会导致竞争条件?是否保证任何类型,或者是否有任何安全要求?

c++ multithreading thread-safety language-lawyer c++11

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

为什么MathJax不使用“ \ LaTeX”宏来呈现LaTeX徽标?

我在一个手写的网页中使用MathJax(很遗憾,该网页尚未联机,因此无法将您指向完整的源代码)。

我将MathJax嵌入到页面中,如下所示,这只是从官方文档中复制/粘贴的:

<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    "HTML-CSS": {
      webFont: "TeX"
    }
  });
</script>
<script
  type="text/javascript"
  src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML.js">
</script>
Run Code Online (Sandbox Code Playgroud)

之后,MathJax似乎可以在我尝试过的每个公式上很好地工作,但是我无法获得它来呈现\TeX\LaTeX命令以获取TeX和LaTeX徽标。网络上的所有内容看起来都像MathJax支持这两个命令一样,我记得几年前在wordpress博客中将它们与MathJax一起使用过,因此我认为一定缺少一些扩展名或选项。

那么,为什么这些命令不起作用?我该怎么做才能解决它们?还是不支持它们?

mathjax

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

`symbolVal` 中的类型错误,无法在运行时获取类型级字符串

我试图了解如何在 Haskell 中使用类型级字符串。我有一个数据类型声明如下:

\n\n
data MyType (s :: Symbol) t = MyType t\n
Run Code Online (Sandbox Code Playgroud)\n\n

将其视为类型的值t以某种方式标记的类型值。

\n\n

现在,当尝试使用symbolVal,我收到一个我不明白的错误。考虑这段代码:

\n\n
func :: KnownSymbol s => MyType s t -> String\nfunc _ = symbolVal (Proxy :: Proxy s)\n
Run Code Online (Sandbox Code Playgroud)\n\n

该代码触发以下编译错误:

\n\n
file.hs:63:21: error:\n    \xe2\x80\xa2 Couldn\'t match kind \xe2\x80\x98*\xe2\x80\x99 with \xe2\x80\x98Symbol\xe2\x80\x99\n      When matching types\n        proxy0 :: Symbol -> *\n        Proxy :: * -> *\n      Expected type: proxy0 n0\n        Actual type: Proxy s0\n    \xe2\x80\xa2 In the first argument of \xe2\x80\x98symbolVal\xe2\x80\x99, namely …
Run Code Online (Sandbox Code Playgroud)

haskell type-level-computation

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