小编Wal*_*ter的帖子

什么是内联命名空间?

C++ 11允许inline namespaces,其所有成员也自动在封闭中namespace.我想不出任何有用的应用 - 有人可以给出一个简短,简洁的例子,说明inline namespace需要哪种情况以及最常用的解决方案?

(另外,当发生了什么并不清楚,我namespace声明inline在一个但不是所有的声明,这可能住在不同的文件.这难道不是找麻烦?)

c++ namespaces c++11 inline-namespaces

320
推荐指数
6
解决办法
5万
查看次数

是否有一种优雅且快速的方法来测试整数中的 1 位是否在连续区域中?

我需要测试位值为 1 的位置(对于 32 位整数从 0 到 31)是否形成连续区域。例如:

00111111000000000000000000000000      is contiguous
00111111000000000000000011000000      is not contiguous
Run Code Online (Sandbox Code Playgroud)

我希望这个测试,即一些功能has_contiguous_one_bits(int),是可移植的。

一个明显的方法是遍历位置以找到第一个设置位,然后是第一个未设置位并检查是否有更多设置位。

我想知道是否存在更快的方法?如果有找到最高和最低设置位的快速方法(但从这个问题看来没有任何可移植的),那么可能的实现是

bool has_contiguous_one_bits(int val)
{
    auto h = highest_set_bit(val);
    auto l = lowest_set_bit(val);
    return val == (((1 << (h-l+1))-1)<<l);
}
Run Code Online (Sandbox Code Playgroud)

只是为了好玩,这里是前 100 个具有连续位的整数:

0 1 2 3 4 6 7 8 12 14 15 16 24 28 30 31 32 48 56 60 62 63 64 96 112 120 124 126 127 128 192 224 240 248 252 254 …
Run Code Online (Sandbox Code Playgroud)

c c++ bit-manipulation

84
推荐指数
7
解决办法
5120
查看次数

如何在使用原始存储时模拟EBO?

我有一个我在实现低级泛型类型时使用的组件,它存储任意类型的对象(可能是也可能不是类类型),它可能是空的,以利用空基本优化:

template <typename T, unsigned Tag = 0, typename = void>
class ebo_storage {
  T item;
public:
  constexpr ebo_storage() = default;

  template <
    typename U,
    typename = std::enable_if_t<
      !std::is_same<ebo_storage, std::decay_t<U>>::value
    >
  > constexpr ebo_storage(U&& u)
    noexcept(std::is_nothrow_constructible<T,U>::value) :
    item(std::forward<U>(u)) {}

  T& get() & noexcept { return item; }
  constexpr const T& get() const& noexcept { return item; }
  T&& get() && noexcept { return std::move(item); }
};

template <typename T, unsigned Tag>
class ebo_storage<
  T, Tag, std::enable_if_t<std::is_class<T>::value>
> : …
Run Code Online (Sandbox Code Playgroud)

c++ c++14

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

如何使用svn重命名文件?

当我尝试时svn mv old_file_name new_file_name,我明白了

 svn: Path 'new_file_name' is not a directory
Run Code Online (Sandbox Code Playgroud)

什么是正确的方法?(对不起,这看起来很琐碎,但我被困了).

PS.使用svn版本1.6.11

编辑它似乎只有在new_file_name引用当前受版本控制的文件的名称时才会出现此错误.在这种情况下,当然,我可以简单地说

 mv old_file_name new_file_name
 svn delete old_file_name
Run Code Online (Sandbox Code Playgroud)

svn

77
推荐指数
3
解决办法
10万
查看次数

什么是长双重文字的C++后缀?

在C++(和C)中,没有后缀的浮点文字默认为double,而后缀f意味着a float.但是后缀是long double什么?

不知道,我会定义,比方说,

const long double x = 3.14159265358979323846264338328;
Run Code Online (Sandbox Code Playgroud)

但我担心的是变量x包含的有效位3.14159265358979323846264338328少于64,因为这是一个double文字.这种担心是否合理?

c c++ literals floating-point-precision

55
推荐指数
3
解决办法
4万
查看次数

如何从移动捕获lambda表达式创建一个std :: function?

我正在尝试创建std::function一个移动捕获lambda表达式.请注意,我可以创建一个移动捕获lambda表达式而不会出现问题; 只有当我尝试将其包装成一个std::function我得到错误时.

例如:

auto pi = std::make_unique<int>(0);

// no problems here!
auto foo = [q = std::move(pi)] {
    *q = 5;
    std::cout << *q << std::endl;
};

// All of the attempts below yield:
// "Call to implicitly-deleted copy constructor of '<lambda...."

std::function<void()> bar = foo;
std::function<void()> bar{foo};
std::function<void()> bar{std::move(foo)};
std::function<void()> bar = std::move(foo);
std::function<void()> bar{std::forward<std::function<void()>>(foo)};
std::function<void()> bar = std::forward<std::function<void()>>(foo);
Run Code Online (Sandbox Code Playgroud)

我会解释为什么我要写这样的东西.我写了一个UI库,类似于jQuery的或JavaFX的,允许用户通过传递给处理鼠标/键盘事件std::functions到方法有相似的名字on_mouse_down(),on_mouse_drag(),push_undo_action(),等.

显然,std::function我想要传入的理想情况下应该使用移动捕获lambda表达式,否则我需要求助于我在C++ 11作为标准时使用的丑陋的"release/acquire-in-lambda"习语:

std::function<void()> baz = …
Run Code Online (Sandbox Code Playgroud)

c++ lambda std c++14

52
推荐指数
3
解决办法
7066
查看次数

C/C++宏/模板blackmagic生成唯一名称

宏很好.模板很好.几乎无论它的工作原理都很好.

这个例子是OpenGL; 但该技术是C++特有的,并且不依赖于OpenGL的知识.

精确问题:

我想要一个表达式E; 我不需要指定唯一名称; 这样,在定义E的地方调用构造函数,并在块E的末尾调用析构函数.

例如,考虑:

class GlTranslate {
  GLTranslate(float x, float y, float z); {
    glPushMatrix();
    glTranslatef(x, y, z);
  }
  ~GlTranslate() { glPopMatrix(); }
};
Run Code Online (Sandbox Code Playgroud)

手动解决方案

{
  GlTranslate foo(1.0, 0.0, 0.0); // I had to give it a name
  .....
} // auto popmatrix
Run Code Online (Sandbox Code Playgroud)

现在,我不仅有glTranslate,还有很多其他的PushAttrib/PopAttrib调用.我宁愿不必为每个var提出一个唯一的名称.是否存在涉及宏模板的一些技巧......或者其他会自动创建变量的变量,在定义点调用构造函数; 和块结束时调用的析构函数?

谢谢!

c++ raii c-preprocessor

40
推荐指数
3
解决办法
2万
查看次数

我可以安全地使用OpenMP和C++ 11吗?

OpenMP标准仅考虑C++ 98(ISO/IEC 14882:1998).这意味着在C++ 03甚至C++ 11下没有标准的OpenMP支持用法.因此,任何使用C++> 98和OpenMP的程序都在标准之外运行,这意味着即使它在某些条件下工作,它也不太可能是可移植的,但绝对不能保证.

C++ 11具有自己的多线程支持,情况更糟,这很可能会在某些实现中与OpenMP发生冲突.

那么,将OpenMP与C++ 03和C++ 11一起使用有多安全?

可以安全地在一个相同的程序中使用C++ 11多线程和OpenMP但不交错它们(即在任何代码中没有传递给C++ 11并发特性的OpenMP语句,并且线程中没有C++ 11并发由OpenMP产生)?

我特别感兴趣的是我首先使用OpenMP调用一些代码,然后在相同的数据结构上使用C++ 11并发代码调用其他代码.

c++ openmp c++11

40
推荐指数
3
解决办法
8776
查看次数

使用SFINAE进行模板类专业化

假设我有这些声明

template<typename T> class User;
template<typename T> class Data;
Run Code Online (Sandbox Code Playgroud)

并且想要实现User<>for T = Data<some_type> 和派生的任何类,Data<some_type>但也允许在别处定义的其他特化.

如果我还没有类模板的声明User<>,我可以简单地说

template<typename T,
         typename A= typename std::enable_if<is_Data<T>::value>::type>
class User { /*...*/ };
Run Code Online (Sandbox Code Playgroud)

哪里

template<template<typename> data>> struct is_Data
{ static const bool value = /* some magic here (not the question) */; };
Run Code Online (Sandbox Code Playgroud)

但是,这有两个模板参数,因此与前一个声明冲突,其中User<>声明只有一个模板参数.还有什么我可以做的吗?

(注意

template<typename T,
         typename A= typename std::enable_if<is_Data<T>::value>::type>
class User<T> { /*...*/ };
Run Code Online (Sandbox Code Playgroud)

不起作用(默认模板参数可能不在部分特化中使用),也不起作用

template<typename T> class User<Data<T>> { /*...*/ };
Run Code Online (Sandbox Code Playgroud)

因为它不允许从中派生类型Data<>,也不允许 …

c++ templates sfinae c++11

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

如何自动更新最大值?

在串行代码中,更新最大值可以简单地通过

template<typename T>
void update_maximum(T& maximum_value, T const& value) noexcept
{
  if(value > maximum_value) maximum_value = value;
}
Run Code Online (Sandbox Code Playgroud)

但是,如何对atomic<T>保存最大值的变量执行此操作:

template<typename T>
void update_maximum(std::atomic<T>& maximum_value, T const& value) noexcept
{
   // want a lock-free, thread-safe implementation
}
Run Code Online (Sandbox Code Playgroud)

显然,串行版本的代码不起作用,因为另一个线程可能maximum_value在加载和存储之间发生变化.可以使用compare_exchange(比较==而不是>)来实现这个吗?怎么样?

请注意,不允许显式锁定(允许的唯一锁定是执行时可能出现的锁定std::atomic<T>).

c++ concurrency atomic max c++11

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