小编HC4*_*ica的帖子

Lisp/Scheme DSEL in C++

我在boost邮件列表上发现了以下帖子(强调我的):

大家好,

有没有人知道现有的精神/ lisp实施,是否有兴趣在开源中开发这样的项目?

还没有,AFAIK.

我将为Spirit2编写一个示例,以补充那里的tiny-C虚拟机.同样有趣的是,方案(或至少它的一个子集)可以用纯c ++实现.没有解析,只是C++中的纯DSEL.现在,想象一个针对此DSEL(通过C++)的解析器 - 源代码转换器.从本质上讲,您的方案代码将被编译为高效的C++.

有人真的这样做过吗?我会对这样的DSEL非常感兴趣.

c++ lisp scheme boost dsel

10
推荐指数
2
解决办法
1542
查看次数

'结构初始化程序中的多余元素'错误与C++ 11统一初始化

我对以下编译器错误感到惊讶:

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

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

C和C++预处理器之间有什么区别?

C和C++预处理器之间的行为有什么不同吗?

它们由标准文本的不同段落定义(C标准的第6.10 节和C++标准的第16节).

我要求这样做的动机是,使单引号成为最近被C++ 14接受的数字分隔符提议扩展了C++预处理器语法以适应这种变化(具体来说,它扩展了pp数的定义),以及我想知道这是否会引入C和C++预处理器之间的不兼容性,如果是这样,它是否是第一个这样做的功能.

c c++ standards c-preprocessor

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

是否有功能模板模板参数这样的东西?

所以我知道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)作为模板参数传递给类?

c++ templates template-templates function-template

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

C++ 11重载决议的奇怪情况

我今天遇到了一个相当奇怪的重载解决方案.我把它减少到以下几点:

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)

c++ overload-resolution c++11

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

什么时候模板类的特殊成员函数被实例化?

实例化模板类的特殊成员函数(特别是复制/移动构造函数和复制/移动赋值运算符)是什么时候?一旦类本身被实例化,或者仅在需要它们时?

这出现在以下情况:

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)

c++ templates clang copy-constructor c++11

8
推荐指数
2
解决办法
4798
查看次数

使用SWIG迭代PHP中的std :: map

我正在使用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()

php c++ swig language-binding map

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

RAII和推导出的模板参数

这是我经常遇到的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 …

c++ templates raii c++11

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

Aptana是否支持ES6?

的Aptana Studio为我的用途语法错误function*yieldJavaScript代码.

这些是ES6功能.是否可以配置Aptana接受它们?

javascript aptana ecmascript-6

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

默认构造一个整数数组是否会初始化它?

如果我有一个带有数组成员的结构,并且我在结构的构造函数中显式调用了数组的默认构造函数,那么元素是否会默认构造?(在整数数组的情况下,这将意味着零初始化).

struct S
{
    S() : array() {}

    int array[SIZE];
};

...

S s;
// is s.array zero-initialized?
Run Code Online (Sandbox Code Playgroud)

使用gcc进行的快速测试表明情况确实如此,但我想确认我可以依赖这种行为.

(我注意到如果我没有在结构构造函数中显式地默认构造数组,则数组元素具有随机值.)

c++ arrays initialization default-constructor

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