小编Tom*_*Tom的帖子

元编程:从boost mpl :: vector中的每个类继承

我希望继承boost mpl :: vector中包含的一组类.这可能吗?

具体来说,我希望扩展test任意多个模板参数,作为mpl :: vector传递.

template<class T>
struct Slice
{
public:
  virtual void foo(T v) const = 0;
};

struct A{};
struct B{};

template <class T1, class T2>
struct test : public Slice<T1>, public Slice<T2>
{
  void foo(T1 a) const {std::cout<<"A"<<std::endl;}
  void foo(T2 b) const {std::cout<<"B"<<std::endl;}
};
Run Code Online (Sandbox Code Playgroud)

如果我知道只有两个参数,那么我可以简单地写:

template <class mpl_vector_t >
struct test : public Slice<typename mpl::at<mpl_vector_t,mpl::int_<0> >::type >, 
          public Slice<typename mpl::at<mpl_vector_t,mpl::int_<1> >::type >
{
  typedef typename mpl::at<mpl_vector_t,mpl::int_<0> >::type T1;
  typedef typename mpl::at<mpl_vector_t,mpl::int_<1> >::type T2; …
Run Code Online (Sandbox Code Playgroud)

c++ metaprogramming boost-mpl

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

Windows 开箱即用支持的语言

我被要求为一组 Windows 机器(我认为是 XP)编写一个(非常)简单的程序 - 如此简单以至于语言的选择并不是真正的问题。但是,我希望能够分发可以直接在 Windows 机器上运行的二进制文件/脚本,而无需预先安装任何解释器或虚拟机。我正在 Linux 机器上开发,我不知道 Windows 支持哪些语言“开箱即用”。任何人都可以建议吗?

例如

  • Perl 会很棒,但我不相信 Windows 机器预装了 Perl?要求用户安装 Perl 以使用我的脚本是不可接受的。
  • 我相信 Python 也有同样的问题?(虽然也许我可以使用 PyInstaller? -就像在这个问题中一样
  • 同样是Java?大多数 Windows 发行版中是否预装了虚拟机?(我知道它在与 Sun Microsystems 发生争执后被删除了?)

到目前为止我能想到的唯一选择是

  • c/c++ 与 MinGW 交叉编译器。

虽然我很高兴用 C++ 编写代码,但我想先检查我的语言选项。

windows installation programming-languages cross-compiling

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

如何迭代到一个较小的容器(即步幅!= 1)

还有一个问题,就是在精神上非常相似这里.不幸的是,这个问题没有引起太多反应 - 我想我会问一个更具体的问题,希望可以提出另一种方法.

我正在写一个二进制文件到std::cin(with tar --to-command=./myprog).二进制文件碰巧是一组浮点数,我想把数据放入std::vector<float>- 理想情况下是c ++方式.

我可以std::vector<char>很好地生成(感谢 这个答案)

#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>

int
main  (int ac, char **av)
{
  std::istream& input = std::cin;
  std::vector<char> buffer;
  std::copy( 
        std::istreambuf_iterator<char>(input), 
           std::istreambuf_iterator<char>( ),
           std::back_inserter(buffer)); // copies all data into buffer
}
Run Code Online (Sandbox Code Playgroud)

我现在想把我std::vector<char>变成一个std::vector<float>,大概是std::transform和一个执行转换的函数(a char[2]到a float,比方说).然而,我正在努力,因为我std::vector<float>将拥有一半的元素std::vector<char>.如果我可以以2的步幅进行迭代,那么我认为我会没事的,但从上一个问题来看,似乎我不能这样做(至少不是优雅的).

c++ iterator stl stl-algorithm

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

当超过32705个线程时,boost :: thread_resource_error

我正在实现一个消息传递算法.消息通过图形的节点传播,阻塞直到它们已经从(其他邻居)接收到足够的信息来发送消息.

如果我将每条消息放在自己的线程中并使用boost :: condition来暂停线程直到所有必需的信息都可用,那么该算法很容易编写.我创建了数千个线程,但大多数线程在任何时候都是活动的.这看起来效果很好.

我的问题是,当单元测试我发现如果我创建超过大约32705线程,我得到

未知位置(0):"Tree_test"中的致命错误:std :: exception:boost :: thread_resource_error

我不知道是什么原因造成的,或者如何解决这个问题.

似乎有很多可用的内存(每个线程只有两个指针 - 消息在它们之间传递的对象).

从这个问题:Linux中每个进程的最大线程数?我认为以下信息是相关的(虽然我真的不知道它有什么意思......)

~> cat /proc/sys/kernel/threads-max
1000000
Run Code Online (Sandbox Code Playgroud)

(我从60120增加了这个 - 我需要重启吗?)

 ~>ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time …
Run Code Online (Sandbox Code Playgroud)

c++ linux multithreading boost-thread

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

提升测试fpic链接错误

我一直在盯着谷歌搜索,但我看不到我做了什么.

我在32位机器上有一个工作项目.我刚刚将存储库拉到64位机器(这是项目的原始开发机器),我现在在尝试构建测试二进制文件时遇到以下链接错误

/usr/bin/ld: error: /usr/lib/libboost_test_exec_monitor-mt.a(unit_test_log.o): requires dynamic R_X86_64_PC32 reloc against 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)' which may overflow at runtime; recompile with -fPIC
/usr/bin/ld: error: /usr/lib/libboost_test_exec_monitor-mt.a(unit_test_log.o): requires unsupported dynamic reloc 11; recompile with -fPIC
Run Code Online (Sandbox Code Playgroud)

我真的看不出我能改变什么.boost库直接从ubuntu存储库中提取.任何有线索的人.

c++ linker boost fpic

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

类中的内存使用 - 将double转换为float并没有像预期的那样减少内存使用量

我正在初始化数百万个以下类型的类

template<class T>
struct node
{
  //some functions
private:
  T m_data_1;
  T m_data_2;
  T m_data_3;

  node* m_parent_1;
  node* m_parent_2;
  node* m_child;
}
Run Code Online (Sandbox Code Playgroud)

模板的目的是使用户能够选择floatdouble精确,其想法是by node<float>将占用更少的内存(RAM).

但是,当我切换doublefloat我的程序的内存占用时,并没有像我期望的那样减少.我有两个问题,

  1. 是否有可能编译器/操作系统保留的空间超过了我的浮动所需的空间(甚至可以将它们存储为双精度).如果是这样,我该如何阻止这种情况发生 - 我在使用g ++的64位机器上使用linux.

  2. 有没有一个工具可以让我确定所有不同类使用的内存量?(即某种内存分析) - 确保内存不会被我想到的其他地方搞砸.

c++ memory-management memory-profiling

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

通过以太网电缆(tcp)进行rs-232串行连接

我有通过rs-232接口(超声脉冲发生器 - 接收器)控制的硬件设备.我需要编写一个程序,将命令从我的计算机发送到设备.然而,不同寻常的是,该设备没有串行端口(DB-9 COM端口),而是具有RJ45插座(以太网插座).该设备随附一个适配器,用于将设备上的以太网端口连接到串行电缆,以便与计算机进行通信.

不幸的是我的电脑没有串口 - 只有一个以太网端口.如果可能的话,我想取消适配器并使用以太网电缆将计算机直接连接到设备.这在物理上是可能的 - 但我不知道如何转换消息协议?例如,我的设备没有用于打开tcp套接字的ip地址?

到目前为止,我一直在使用Boost.asio(在Ubuntu盒子上)通过tcp套接字将消息流发送到支持tcp的其他设备.如果可能的话,我想继续使用Boost.Asio库 - 因为它是跨平台的.我真的不知道从哪里开始 - 我一直使用Boost.Asio库,它很好地隐藏了大部分协议问题.我相信这是可能的,因为有些Windows程序似乎做了类似的事情,请参阅http://com0com.sourceforge.net/

任何指导性建议都会受到欢迎.非常感谢

c++ tcp ethernet serial-port boost-asio

0
推荐指数
2
解决办法
9104
查看次数