我在boost邮件列表上发现了以下帖子(强调我的):
大家好,
有没有人知道现有的精神/ lisp实施,是否有兴趣在开源中开发这样的项目?
还没有,AFAIK.
我将为Spirit2编写一个示例,以补充那里的tiny-C虚拟机.同样有趣的是,方案(或至少它的一个子集)可以用纯c ++实现.没有解析,只是C++中的纯DSEL.现在,想象一个针对此DSEL(通过C++)的解析器 - 源代码转换器.从本质上讲,您的方案代码将被编译为高效的C++.
有人真的这样做过吗?我会对这样的DSEL非常感兴趣.
我对以下编译器错误感到惊讶:
template <typename T>
struct A
{
A(T t): t_{t} {}
T t_;
};
struct S
{
};
int main()
{
A<S> s{S{}};
}
Run Code Online (Sandbox Code Playgroud)
错误是(与clang):
test.cpp:4:16: error: excess elements in struct initializer
A(T t): t_{t} {}
^
test.cpp:15:10: note: in instantiation of member function 'A<S>::A' requested here
A<S> s{S{}};
^
Run Code Online (Sandbox Code Playgroud)
GCC给出了类似的错误.
我希望表达t_{t},试图复制构建t_从t.由于S有一个隐式生成的复制构造函数,我不希望这是一个问题.
有人能解释一下这里发生了什么吗?
c++ copy-constructor initializer-list uniform-initialization c++11
所以我知道C++有一个名为"模板模板参数"的功能,您可以将类模板作为模板参数传递.例如:
template <typename T>
class vector { ... };
template <template <typename> class container> // this is a template template parameter
class foo { ... };
...
foo<vector> f; // pass the vector template itself as template parameter
Run Code Online (Sandbox Code Playgroud)
功能模板有类似之处吗?即有没有办法将函数模板(例如std::make_pair)作为模板参数传递给类?
我今天遇到了一个相当奇怪的重载解决方案.我把它减少到以下几点:
struct S
{
S(int, int = 0);
};
class C
{
public:
template <typename... Args>
C(S, Args... args);
C(const C&) = delete;
};
int main()
{
C c({1, 2});
}
Run Code Online (Sandbox Code Playgroud)
我完全希望C c({1, 2})匹配第一个构造函数C,其中可变参数的数量为零,{1, 2}并被视为S对象的初始化列表构造.
但是,我得到一个编译器错误,表明它匹配C的已删除的复制构造函数!
test.cpp: In function 'int main()':
test.cpp:17:15: error: use of deleted function 'C(const C &)'
test.cpp:12:5: error: declared here
Run Code Online (Sandbox Code Playgroud)
我可以看看它是如何工作的 - {1, 2}可以被解释为C的有效初始化器,它1是一个初始化器S(可以从int隐式构造,因为它的构造函数的第二个参数有一个默认值),以及2作为一个可变参数...但我不明白为什么那将是一个更好的匹配,尤其是看到有问题的复制构造函数被删除.
有人可以请解释这里正在使用的重载决策规则,并说明是否有一个解决方法不涉及在构造函数调用中提及S的名称?
编辑:由于有人提到代码片段使用不同的编译器编译,我应该澄清我在GCC 4.6.1中遇到了上述错误.
编辑2:我进一步简化了片段以获得更令人不安的失败:
struct …Run Code Online (Sandbox Code Playgroud) 实例化模板类的特殊成员函数(特别是复制/移动构造函数和复制/移动赋值运算符)是什么时候?一旦类本身被实例化,或者仅在需要它们时?
这出现在以下情况:
template <class T, class U>
struct pair
{
T first;
U second;
pair() : first(), second() {}
pair(const pair&) = default;
};
struct S
{
S() {}
S(const S&) = delete;
S(S&&) = default;
};
int main()
{
pair<int, S> p;
}
Run Code Online (Sandbox Code Playgroud)
Clang拒绝编译此代码,但有以下错误:
test.cpp:9:5: error: the parameter for this explicitly-defaulted copy constructor is const, but a member or base requires it to be
non-const
pair(const pair&) = default;
^
test.cpp:21:18: note: in instantiation of template class 'pair<int, S>' …Run Code Online (Sandbox Code Playgroud) 我正在使用SWIG来包装一个std::map在PHP 中返回的函数.
在PHP代码中,我需要遍历地图的元素.
Thw SWIG库提供std::map了对std_map.i接口文件的支持,但只包含以下方法:
clear()
del($key)
get($key)
has_key($key)
is_empty()
set($key, $x)
size()
Run Code Online (Sandbox Code Playgroud)
如何迭代地图元素?我需要的扩展std_map.i文件带有某种包装对迭代器和begin()和end()?
这是我经常遇到的RAII问题.我想知道是否有人有一个很好的解决方案.
从标准RAII实用程序类开始:
class RAIIHelper {
RAIIHelper() {
AcquireAResource();
}
~RAIIHelper() {
ReleaseTheResource();
}
};
Run Code Online (Sandbox Code Playgroud)
现在,由于各种原因,我需要将其作为模板.我们还说它的构造函数接受模板参数类型的参数:
template <typename T>
class RAIIHelper {
RAIIHelper(T arg) {
AcquireAResource();
}
~RAIIHelper() {
ReleaseTheResource();
}
};
Run Code Online (Sandbox Code Playgroud)
现在考虑使用网站:
void func() {
RAIIHelper<SomeType> helper(someObj);
}
Run Code Online (Sandbox Code Playgroud)
SomeType当它可以从中推断时必须写出来很烦人someObj,因此我编写了一个辅助函数来推断出类型:
template <typename T>
RAIIHelper<T> makeRAIIHelper(T arg) {
return RAIIHelper<T>(arg);
}
Run Code Online (Sandbox Code Playgroud)
现在我可以像这样使用它:
void func() {
auto helper = makeRAIIHelper(someObj);
}
Run Code Online (Sandbox Code Playgroud)
很棒,对吧?除了有一个障碍:RAIIHelper现在需要是可复制的或可移动的,并且释放资源的析构函数可能被调用两次:一次用于返回的临时值makeRAIIHelper,一次用于调用函数中的局部变量.
实际上,我的编译器执行RVO,并且只调用析构函数一次.但是,这不能保证.这可以从以下事实看出:如果我尝试给出RAIIHelper一个= delete'd move构造函数,代码就不再编译了.
我可以向RAIIHelper添加额外的状态,以便它知道ReleaseTheResource()在移动之后不会调用,但这是额外的工作,在我添加makeRAIIHelper()以获得类型扣除之前是不必要的.
有没有办法可以获得类型演绎,而无需添加额外的状态RAIIHelper …
的Aptana Studio为我的用途语法错误function*和yieldJavaScript代码.
这些是ES6功能.是否可以配置Aptana接受它们?
如果我有一个带有数组成员的结构,并且我在结构的构造函数中显式调用了数组的默认构造函数,那么元素是否会默认构造?(在整数数组的情况下,这将意味着零初始化).
struct S
{
S() : array() {}
int array[SIZE];
};
...
S s;
// is s.array zero-initialized?
Run Code Online (Sandbox Code Playgroud)
使用gcc进行的快速测试表明情况确实如此,但我想确认我可以依赖这种行为.
(我注意到如果我没有在结构构造函数中显式地默认构造数组,则数组元素具有随机值.)