7

有时需要将一个没有任何数据的虚拟值传递给某个模板。例如:

template <typename X, typename Y> 
struct BoundaryConditions {
  X x; Y y;
  BoundaryConditions(typename X::init xi, typename Y::init yi) : x(xi), y(yi) {
    ...
  }
};

我们可能希望实现不带任何参数的自由边界条件。通过类型检查实现这样的事情非常容易:

struct Nothing {};
Nothing nothing = Nothing();

struct Free {
  typedef Nothing init;
  ...
};

BoundaryConditions<Free, Fixed> foo(nothing, 100);

所以我的问题是:Nothing在标准库或 boost 中是否有类似我的类型的实现?

4

5 回答 5

8

您可以使用空元组。喜欢std::tuple<>();

于 2013-10-18T11:38:44.803 回答
4

通常的解决方案是使用void,但这需要模板的部分特化(这也很常见,否则它需要更多空间)。

于 2013-10-18T11:39:44.220 回答
3

boost::none和怎么样boost::none_t

http://www.boost.org/doc/libs/1_54_0/boost/none.hpp

于 2013-10-18T11:39:21.323 回答
0

Boost.MPL提供类型void_.

于 2013-10-18T11:39:30.530 回答
0

void似乎是一种自然的方式,因为它是 > void <。但是 C++ 不允许实例化这种类型,因此在必须声明大量模板类时它是无用的。允许这样做但表示“空类型”的单独类型的典型使用将是专门用于在每个事件中提供的“无数据”的模板事件总线。如:

#include <variant>
typedef std::monostate nothing;
...
observable<nothing> bus;

这与任何其他类型一样便携,但嵌入其中,std因此存在一定程度的标准化。

于 2021-10-19T17:22:36.097 回答