小编Dan*_*olf的帖子

如何@link 未导入的内容?

TypeScript最近在 JSDoc 注释中引入了@link标签。文档在这里

但是,@link仅当 TypeScript 编译器知道链接目标时才会生成实际链接。换句话说,我链接到的任何内容都必须在同一文件中声明或导入。然而,情况并非总是如此。以这个(虚构的)例子为例:

轮子.ts

/** A wheel for use with a {@link Car}. */
export interface Wheel {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

在此示例中, wheel.ts中的 JSDoc 注释引用了Car单独文件car.ts中定义的类型。因为Wheel.ts不导入car.ts,所以 TypeScript 不知道@link Car指向什么。因此,Car在 VS Code 中显示文档时无法显示正确的链接:

截屏

所以我的问题是:我如何告诉 TypeScript 在哪里可以找到 的定义Car

我尝试过以下方法:

1. 常规进口

添加到wheel.tsimport { Car } from './car';的顶部可以解决问题并创建一个实际链接(注意“Car”现在如何变成蓝色):Car

在此输入图像描述

但是,它会导致导入行上出现 TypeScript 错误“'Car'已声明,但从未读取其值。(6133)” 。 …

typescript

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

CMake生成器表达式中的三元运算符

Cmake的生成器表达式允许我在某些函数调用中使用逻辑表达式.例如,如果我想/MTd在调试模式下添加编译器标志,我可以说

add_compile_options($<$<CONFIG:Debug>:/MTd>)
Run Code Online (Sandbox Code Playgroud)

如果CONFIG等于"Debug",则将add_compile_options使用值"/ MTd" 调用,否则使用空字符串调用.

但通常,我不想在值和空字符串之间做出决定,而是在两个值之间做出决定.在上面的例子中,如果CONFIG "调试",我想通过/MT(没有拖尾d).我希望有这样的语法:

add_compile_options($<$<CONFIG:Debug>:/MTd:/MT>)
Run Code Online (Sandbox Code Playgroud)

请注意,根据CMake规范,上述内容不是有效代码.我提出的最好的实际工作是这样的:

add_compile_options($<$<CONFIG:Debug>:/MTd>$<$<NOT:$<CONFIG:Debug>>:/MT>)
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎是多余的.是否有更短,更易读的方式来决定两个值?

注意:我意识到在这种特殊情况下,我可以这样写:

add_compile_options(/MT$<$<CONFIG:Debug>:d>)
Run Code Online (Sandbox Code Playgroud)

但这对我来说似乎相当苛刻,只适用于其中一个选项是另一个选项的子串的情况.

cmake ternary-operator

19
推荐指数
2
解决办法
3787
查看次数

如何在Windows上将UTF-8字符串打印到std :: cout?

我正在用C++编写一个跨平台的应用程序.所有字符串都在内部进行UTF-8编码.请考虑以下简化代码:

#include <string>
#include <iostream>

int main() {
    std::string test = u8"Greek: ????; German: Übergrößenträger";
    std::cout << test;

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

在Unix系统上,std::cout期望8位字符串是UTF-8编码的,所以这段代码工作正常.

但是,在Windows上,要求std::cout8位字符串采用Latin-1或类似的非Unicode格式(取决于代码页).这导致以下输出:

希腊语:????????; 德语:?£bergr?Âentr?ñger

如何std::cout在Windows上将8位字符串解释为UTF-8?

这是我试过的:

#include <string>
#include <iostream>
#include <io.h>
#include <fcntl.h>

int main() {
    _setmode(_fileno(stdout), _O_U8TEXT);
    std::string test = u8"Greek: ????; German: Übergrößenträger";
    std::cout << test;

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

我希望_setmode能做到这一点.但是,这会在调用的行中导致以下断言错误operator<<:

Microsoft Visual C++运行时库

调试断言失败!

程序:d:\ visual studio 2015\Projects\utf8test\Debug\utf8test.exe文件:minkernel\crts\ucrt\src\appcrt\stdio\fputc.cpp行:47

表达式:((_Stream.is_string_backed())||(fn = _fileno(_Stream.public_stream()),((_ textmode_safe(fn)== __crt_lowio_text_mode :: ansi)&&!_ tm_unicode_safe(fn)))) …

c++ windows encoding utf-8

18
推荐指数
3
解决办法
2万
查看次数

如何从IReadOnlyDictionary <,>创建一个新的Dictionary <,>?

.NET 4.5引入了方便的IReadOnlyDictionary<TKey, TValue>界面.A Dictionary<TKey, TValue> 是一个 IReadOnlyDictionary<TKey, TValue>,所以我可以通过前者而不需要后者.

但我不确定相反的方式:如何Dictionary<,>基于现有创建新的IReadOnlyDictionary<,>

  • Dictionary<,>有几个构造函数采取IDictionary<,>- 但没有采取IReadOnlyDictionary<,>.
  • IReadOnlyDictionary<,>有一个扩展方法ToDictionary<,>().但是,这是继承自IEnumerable<>.因此,要使用它,我必须通过两项完全冗余的代表是这样的:readOnlyDict.ToDictionary(pair => pair.Key, pair => pair.Value).丑陋!
  • 当然,我总是可以创建一个新的Dictionary<,>,迭代原始对并复制它们.

在我看来,应该有一个微不足道的方法来创建一个Dictionary<,>基于现有的新IReadOnlyDictionary<,>.我错过了什么吗?

编辑:一些澄清.我不是在寻找治疗的一些神奇的方法IReadOnlyDictionary<,>Dictionary<,>.我想创建一个Dictionary<,>从a 复制其初始值的new IReadOnlyDictionary<,>.这个问题是一个冗长的问题:

Dictionary<,>有一个方便的构造函数来复制一个初始值IDictionary<,>.为什么没有一个人拿出一个IReadOnlyDictionary<,>什么是实现相同结果的最惯用的方法呢?

c# dictionary

17
推荐指数
3
解决办法
7105
查看次数

如何查找集合的所有分区

我有一套不同的价值观.我正在寻找一种方法来生成此集合的所有分区,即将集合划分为子集的所有可能方式.

例如,该集{1, 2, 3}具有以下分区:

{ {1}, {2}, {3} },
{ {1, 2}, {3} },
{ {1, 3}, {2} },
{ {1}, {2, 3} },
{ {1, 2, 3} }.
Run Code Online (Sandbox Code Playgroud)

由于这些是数学意义上的集合,因此顺序无关紧要.例如,{1, 2}, {3}是相同的,{3}, {2, 1}也不应该是单独的结果.

可以在Wikipedia上找到集合分区的完整定义.

c# algorithm partitioning set

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

C#为什么定时器频率极度偏离?

这两个System.Timers.TimerSystem.Threading.Timer火在离请求的那些相当不同的时间间隔.例如:

new System.Timers.Timer(1000d / 20);
Run Code Online (Sandbox Code Playgroud)

产生一个每秒发射16次而不是20次的计时器.

为了确保太长的事件处理程序没有副作用,我写了这个小测试程序:

int[] frequencies = { 5, 10, 15, 20, 30, 50, 75, 100, 200, 500 };

// Test System.Timers.Timer
foreach (int frequency in frequencies)
{
    int count = 0;

    // Initialize timer
    System.Timers.Timer timer = new System.Timers.Timer(1000d / frequency);
    timer.Elapsed += delegate { Interlocked.Increment(ref count); };

    // Count for 10 seconds
    DateTime start = DateTime.Now;
    timer.Enabled = true;
    while (DateTime.Now < start + TimeSpan.FromSeconds(10))
        Thread.Sleep(10);
    timer.Enabled = false;

    // Calculate …
Run Code Online (Sandbox Code Playgroud)

c# timer frequency deviation

14
推荐指数
3
解决办法
8269
查看次数

C++ 11:lambda捕获的破坏顺序是什么?

假设我有两个本地智能指针,foo并且bar.

shared_ptr<Foo> foo = ...
shared_ptr<Bar> bar = ...
Run Code Online (Sandbox Code Playgroud)

这些智能指针是围绕资源的包装器,由于某种原因必须按顺序销毁foo,然后bar.

现在我想创建一个使用foo和的lambda bar,但是比包含它们的范围更长.所以我会按价值捕捉它们,如下所示:

auto lambda = [foo, bar]() { ... };
Run Code Online (Sandbox Code Playgroud)

这将在函数对象中创建foo和复制bar.当函数对象被破坏时,这些副本也将被破坏,但我关心这种情况发生的顺序.所以我的问题是:

当一个lambda对象被破坏时,它的by-value会以什么顺序捕获被破坏的?我怎么能(希望)影响这个命令呢?

c++ lambda raii c++11

12
推荐指数
4
解决办法
1159
查看次数

Instant和ZonedDateTime之间的兼容性

据我所知,a ZonedDateTime实际上是一个增强版本Instant.它具有所有数据Instant(沿UTC时间线的精确值),以及时区信息.因此,我天真的假设是,a ZonedDateTime -an Instant并且任何采取Instant遗嘱的方法都会采取ZonedDateTime相反的方式.此外,我所料isBefore(),isAfter()等之间进行无缝协作InstantS和ZonedDateTime秒.

查看API文档,Instant并且ZonedDateTime没有一个是这种情况.我可以将Instants与Instants和ZonedDateTimes 进行比较ZonedDateTime,但这两个类似乎是不兼容的.更重要的是,像ThreeTen-Extra这样的第三方代码Interval似乎只适用于Instants.

是否存在Instant并且ZonedDateTime不打算混合的原因?

java datetime java-time

11
推荐指数
2
解决办法
1216
查看次数

如何使用具有react-router路由转换的自定义组件?

" 确认导航"一文解释了如何在转换钩子中使用浏览器确认框.精细.但我想使用自己的对话框.如果我使用history模块中的方法,我认为这是可能的.是否可以使用setRouteLeaveHookin react-router进行此操作?

javascript react-router

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

CMake似乎忽略了CMAKE_OSX_DEPLOYMENT_TARGET

我在OS X 10.10.5上使用CMake 3.3.2和Xcode 7.1.

我有一个使用CMake的小型C++项目.我希望它在OS X 10.9或更高版本上运行.所以我修改了我的CMakeLists.txt来开始这个:

cmake_minimum_required(VERSION 3.3)
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9")

project(...
Run Code Online (Sandbox Code Playgroud)

然后我像这样创建Xcode项目:

cmake -G Xcode <path>
Run Code Online (Sandbox Code Playgroud)

但是,生成的xcodeproj软件包似乎没有设置部署目标.当我在文本编辑器中打开包含的project.pbxproj文件时,没有提及行MACOSX_DEPLOYMENT_TARGET.

因此,当我在Xcode中打开项目时,在Build Settings> Deployment> OS X Deployment Target下,Xcode总是显示默认值"OS X 10.11",无论我在CMakeLists.txt中指定了什么.当我手动更改Xcode中的设置,然后在文本编辑器中重新打开项目文件时,MACOSX_DEPLOYMENT_TARGET = 10.9;已正确添加该行.

难道我做错了什么?谷歌搜索问题没有给出任何最近的结果.

c++ xcode cmake

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