小编ast*_*bia的帖子

解压缩可变参数模板参数以定义新模板参数

我是模板编程的新手,我有两个问题......希望有人可以帮助我.我试图使用可变参数模板生成另一个可变参数模板的新输入.换句话说,我有一堂课

template <std::size_t N, std::size_t... M>
class Class1 {

}
Run Code Online (Sandbox Code Playgroud)

我想使用N,M表示的整数值来生成一组新的std :: bitset类型输入到另一个模板类

template <typename T, typename... Ts>
class Class2 {

}
Run Code Online (Sandbox Code Playgroud)

所以例如,如果我使用Class1<10,20,25>我想在体内Class1创建一个 Class2<std::bitset<10>, std::bitset<20>, std::bitset<25>> 变量.使用C++ 11有一种简单的方法吗?

那么我的第二个问题是如何进一步抽象这一点,以便解包不是特定于std::bitset类?有没有办法修改Class1模板定义,以便我可以扩展我开发的一些任意模板类而不是std::bitset

c++ templates variadic-templates c++11

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

通过 docker 下载并运行带有 gnome 支持的 ubuntu-desktop

我对 docker 完全陌生。我有一个安装了 docker 的 Redhat 7 桌面。我现在想通过 docker 运行一个完整的 ubuntu-desktop 18.04 (包括它的 gnome GUI)。如何才能做到这一点?我一直在谷歌搜索有关在哪里可以下载 ubuntu 18.04 docker 映像(具有 GUI 支持)并运行它的说明/教程,但令人惊讶的是我找不到任何东西。有人能帮我吗?谢谢。

docker

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

OpenMP 任务异常处理的正确方法是什么?

当您的代码使用 OpenMP 任务时,应该如何放置 try-catch 块?是否应该在每个任务中定义一个 try-catch 块,或者单个 try-catch 块是否可以包含所有任务?换句话说,考虑这段代码:

int main()
{
  
    #pragma omp parallel
    {
        #pragma omp single
        {
            try
            {
              #pragma omp task
              { /*some code here*/ }

              #pragma omp task
              { /*some code here*/ }            
            }
            catch(Exception &e)
            {
              //I want to do something here whenever one of the tasks throws an exception
            }
        }
    }
    
}
Run Code Online (Sandbox Code Playgroud)

如果我想捕获其中一个任务抛出的任何异常,以便打印与该异常相对应的错误消息并中止程序,上面的代码是否正确?或者我是否需要在每个任务中定义一个 try-catch 块,如下所示?:

int main()
{
    
    #pragma omp parallel
    {
        #pragma omp single
        {
            #pragma omp task
            { 
              try
              { …
Run Code Online (Sandbox Code Playgroud)

c++ openmp

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

为什么当 OMP_SCHEDULE=static 时 omp_get_schedule() 返回单调调度?

我正在 redhat8 上使用 g++8.5 编译我的代码,我注意到当我设置 OMP_SCHEDULE=static 时,然后在我的应用程序中 omp_get_schedule() 返回一个“单调”计划而不是“静态”计划。为什么会发生这种情况?如果我将 OMP_SCHEDULE 设置为其他内容(例如“动态”),那么我的应用程序会将其识别为“动态”。这是有问题的代码。有任何想法吗?谢谢

             omp_sched_t kind;                 
             int chunk_size;
             omp_get_schedule(&kind, &chunk_size);
             
             switch(kind)
             {
               case omp_sched_static:
               {
                 schedule_msg = schedule_msg + "schedule=static, chunk_size="+std::to_string(chunk_size);
                 break;
               }
               case omp_sched_dynamic:
               {                     
                 schedule_msg = schedule_msg + "schedule=dynamic, chunk_size="+std::to_string(chunk_size);
                 break;
               }
               case omp_sched_guided:
               {
                 schedule_msg = schedule_msg + "schedule=guided, chunk_size="+std::to_string(chunk_size);                     
                 break;
               }
               case omp_sched_auto:
               {
                 schedule_msg = schedule_msg + "schedule=auto, chunk_size="+std::to_string(chunk_size);                     
                 break;
               }
               default:
               {
                 schedule_msg = schedule_msg + "schedule=monotonic, chunk_size="+std::to_string(chunk_size); 
                 break;
               }
             }   
Run Code Online (Sandbox Code Playgroud)

c++ openmp

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

静态constexpr类成员变量安全多线程读取?

将多个线程同时读取类的静态constexpr成员变量是否安全?例如:

class A{
  public:
    //some code here
  private:
    static constexpr std::size_t x_ = 99;

}
Run Code Online (Sandbox Code Playgroud)

如果我创建多个Class类型的A对象,每个对象由不同的线程使用,那么每个C++ 11线程可以安全地独立读取成员变量x_而不使用任何锁定机制吗?

c++ multithreading thread-safety c++11

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

使用memcpy将float数组复制到uint8_t数组是否有效

我有一个浮点数组(每个浮点数4个字节),我想将数据复制到一个字节数组(uint8_t)并将其视为字节.后来我可能想要将字节数据复制回浮点数组,并将其再次作为各种操作的浮点数处理.这在c ++中有效吗?换句话说,就像这样,我暂时将浮点数视为字节有效?

std::array<std::uint8_t, 40> b;
b.fill(0);
std::array<float,10> f;
f.fill(3.14);
std::memcpy(b.data(),f.data(),40);
std::array<float,10> f2;
f2.fill(0);
std::memcpy(f2.data(),b.data(),40);
for(std::size_t i=0;i<10;i++)
{
  std::cout<<f2[i]<<std::endl; //now i want to access the float data
} 
Run Code Online (Sandbox Code Playgroud)

c++

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

紧凑的switch语句,使用重复相同的模板化函数

我有以下C++代码和一个相当大的switch语句(我使用的是C++ 11编译器):

void function(std::size_t i, other_args)
{
   switch(i)
   {
      case 0:
         templatedfunction<0>(other_args);
         break;
      case 1:
         templatedfunction<1>(other_args);
         break;
      case 2:
         templatedfunction<2>(other_args);
         break;
      ...............
      //lots of other cases here
      ...............
      case 100:
         templatedfunction<100>(other_args);
         break;

   }  

}
Run Code Online (Sandbox Code Playgroud)

在哪里templatedfunction定义为

template<std::size_t T>
void templatedfunction(other_args){
   //some code here
}
Run Code Online (Sandbox Code Playgroud)

这是用于描述简单概念的许多代码行(即,templatedfunction使用i与其模板化参数中传递的变量相同的值调用).在C++中有没有办法更紧凑地编写这段代码?应该有一种方法可以更紧凑地实现这个long switch语句....使用templatedfunction<i>(other_args)不会编译,因为它i是一个变量而不是编译时常量.谢谢.

c++ templates c++11

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

是否可以使用 C++ 宏来生成代码块?

我有一个 C++ 程序,其中某些模式的代码块不断重复,我想知道是否可以使用 C++ MACROS 作为预处理器来自动生成此代码。更准确地说,我有一些看起来像这样的代码块:

for(std::size_t i=0;i< lc_.size(); i++)
{
  std::string str;
  state::MsData lc = data->lc(i);
  convert<data::ClassForLC>(lc.data(), str);
  lc_[i] = data::ClassForLC(str);
}
Run Code Online (Sandbox Code Playgroud)

然后我可能有另一个看起来像这样的块:

for(std::size_t i=0;i< mmop_.size(); i++)
{
  std::string str;
  state::MvData mmop = data->mmop(i);
  convert<data::ClassForMMOP>(mmop.data(), str);
  mmop_[i] = data::ClassForMMOP(str);
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的一般模式是这样的:

  for(std::size_t i=0;i< X_.size(); i++)
    {
      std::string str;
      Y X = data->X(i);
      convert<Z>(X.data(), str);
      X_[i] = Z(str);
    }
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以定义一个宏 REPLACE(X,Y,Z) 用我作为参数传递的任何文本替换上面代码中的 X,Y,Z ?注意:我使用 C++11。谢谢

c++ c++11

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