Visual Studio 2010中一个很酷的新C++特性是lambda表达式.但是,我无法让他们在托管类中工作.
class UnmanagedClass {
void Foo() {
// Creating empty lambda within unmanaged class.
// This compiles fine.
auto lambda = [](){ ; };
}
};
ref class ManagedClass {
void Foo() {
// Creating empty lambda within managed class.
// This creates error C3809:
// A managed type cannot have any friend functions/classes/interfaces.
auto lambda = [](){ ; };
}
};
Run Code Online (Sandbox Code Playgroud)
我最好的猜测是编译器将匿名函数类创建为友元类,即使我从不使用类成员.这似乎意味着lambda不能在ref类中使用.
当我读到VS2010将lambda表达式添加到C++时,我感到非常高兴.有人知道如何让他们在ref类中工作吗?
为了实现2D动画,我正在寻找两个关键帧之间的插值,其中变化的速度由贝塞尔曲线定义.问题是贝塞尔曲线以参数形式表示,而要求是能够评估特定时间的值.
详细说来,假设10和40的值将在4秒内插值,其值不是经常变化,而是由表示为0,0 0.2,0.3 0.5,0.5 1,1的贝塞尔曲线定义.现在如果我以每秒24帧的速度绘制,我需要评估每帧的值.我怎样才能做到这一点 ?我看了De Casteljau算法并且认为将曲线分成24*4个片段4秒将解决我的问题但是这听起来是错误的,因为时间沿着"x"轴而不是沿着曲线.
进一步简化如果我在平面中绘制曲线,x轴表示时间,y轴表示我正在寻找的值.我实际需要的是能够找出对应于"x"的"y".然后我可以在24个分区中划分x并知道每个帧的值
我正在为相当复杂的 XML 文件格式编写 XSD。在许多情况下,XML 可以包含实际的文字值或生成该值的脚本。(想想 Excel:42与=21+21)
例如,要指定大小,写入以下任一内容应该是有效的:
<size>42</size>
<size><script>2*21</script></size>
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是在元素<choice>中允许使用 int 或脚本size。但是,然后我必须给字符串元素一个名称,从而导致像<size><value>42</value></size>. 由于文字的使用频率远远高于脚本,因此我不想让它们的语法变得臃肿。
关于如何在 XSD 中表达初始语法有什么想法吗?
我有一个文本文件,其中包含我的应用程序所需的资源。该文件包含任意纯文本,而不是带有变量赋值的 C++ 代码。我不想将文本文件与我的申请一起发送;我更愿意将其编译到其中。所以我尝试了以下方法:
#include <iostream>
#include <string>
int main() {
std::string test = R"(
#include <textresource.txt>
)";
std::cerr << test << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我希望#include第 6 行在预处理时执行,并替换为资源文件的内容。之后,编译器将看到带有资源数据的原始字符串文字。
然而,输出只是#include <textresource.txt>带有换行符的文本。显然,它#include从未被执行过。(我使用的是 Visual Studio 2015。)
为什么工作没有#include按预期进行?是否有其他语法可以在编译时将文本文件(而不是代码)导入到变量中?
我的理解CMAKE_CURRENT_BINARY_DIR应该指向当前CMakeLists.txt文件的二进制文件所在的目录。但是,事实并非如此。
考虑以下文件结构:
CMakeTest
+- CMakeLists.txt
+- main.cpp
Run Code Online (Sandbox Code Playgroud)
CMakeLists.txt
cmake_minimum_required(VERSION 3.2)
add_executable(CMakeTest main.cpp)
message(STATUS "CMAKE_CURRENT_BINARY_DIR = ${CMAKE_CURRENT_BINARY_DIR}")
Run Code Online (Sandbox Code Playgroud)
main.cpp
#include <iostream>
int main() {
std::cout << "Hello, World!";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在(Windows)命令行上,我运行以下命令:
md build
cd build
cmake .. -G "Visual Studio 14 2015"
cmake --build .
Run Code Online (Sandbox Code Playgroud)
第一条cmake命令(除其他外)打印该行
CMAKE_CURRENT_BINARY_DIR = X:/ dev / projects / CMakeTest / build
因此,我希望生成的二进制文件CMakeTest.exe最终会在那里。但是实际上,它位于X:/ dev / projects / CMakeTest / build / Debug中。
为什么二进制文件没有放在CMAKE_CURRENT_BINARY_DIR子目录中?是否有任何CMake变量告诉我该子目录是什么?
编辑:
我没有尝试更改放置二进制文件的目录。我正在尝试确定它。原因是这样的:
在构建期间,在与可执行文件相同的目录中创建了许多其他资源文件。(这部分工作。)我想使用install(FILES, …
考虑下面的 Rust 函数,它的目的是指示给定的 3 字节字符串是否等于b"foo"。
fn is_foo(value: [u8; 3]) -> bool {
value == b"foo"
}
Run Code Online (Sandbox Code Playgroud)
这不起作用:
错误[E0277]:无法
[u8; 3]比较&[u8; 3]
编译器抱怨它无法将某种类型的值与相同类型的引用进行比较。
我发现了两种让平等检查发挥作用的方法:
&value == b"foo"value == *b"foo"来自 C++(其中值和引用几乎是同一件事),这两种方法对我来说看起来都有点奇怪。比较值和引用的最惯用的方法是什么?
我如何忽略文件?我想排除任何子目录中以_开头的所有文件。这两种方法我都没有成功:
this.fs.copyTpl(
this.templatePath('basicFiles/'),
this.destinationPath(''),
answers,
{ignore:"_*.*"}
);
this.fs.copyTpl(
[!*.*,this.templatePath('basicFiles/')],
this.destinationPath(''),
answers
);
Run Code Online (Sandbox Code Playgroud)
更笼统地说,想将每个basic / _exmaple.json合并(深层复制)到AdditionalConfig / example.json到desitnationPaht / exmaple.json(合并)。
每个想法都是受欢迎的:)。
我是查找表的硬编码值.所需数量的元素来自包含的文件,该文件可能在将来的某个时刻发生变化.所以我想在编译时确保我指定的元素数量确实与所需数量匹配.
看看这段代码:
#include <array>
// Assume this comes from some included file
constexpr size_t elementCount = 5;
int main() {
// This works.
const std::array<int, elementCount> lookup { 2, 4, 6, 8, 10 };
// But so does this.
const std::array<int, elementCount> lookup2 { 2, 4, 6 };
return 0;
}
Run Code Online (Sandbox Code Playgroud)
std::array看起来非常适合查找表,因为它的大小在编译时是固定的.但是,我无法确保使用正确数量的元素初始化它.由于聚合初始化,即使我指定的元素太少,该示例也会编译正常.
我提出了以下解决方法,但感觉非常难看:
#include <array>
template<class T> std::array<T, 1> makeArray(T e1) {
return { e1 };
}
template<class T> std::array<T, 2> makeArray(T e1, …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Babel插件,需要操作代码文件中的每个顶级声明,即直接在Program节点下面的每个声明.
Babel插件手册说"手动查找时不要遍历",解释说我可以简单地遍历子节点.这很好.我的问题是,所有的操作功能- ,,replaceWith 等-被定义的路径,而不是节点.所以,当我在子节点上进行迭代时,我该如何操作它们呢?insertBeforeinsertAfter
在我看来,我需要一些从给定节点获取路径对象的方法.但我只能找到相反案例的文档:从路径对象(path.node)获取节点.