小编use*_*616的帖子

为什么 std::codecvt 仅用于文件 I/O 流?

我一直在实现一个用于处理输出流标识的 codecvt。它可以像这样使用并且工作正常:

std::cout << indenter::push << "im indentet" << indenter::pop << "\n im not..."
Run Code Online (Sandbox Code Playgroud)

然而,虽然我可以将 an 灌输std::codecvt给任何std::ostream我,但当我发现我的代码可以与std::cout以及一起工作时,我感到非常困惑std::ofstream,但例如,std::ostringstream即使所有这些都继承自基类std::ostream

facet正常构造,代码编译,它不会抛出任何异常......只是没有std::codecvt调用任何成员函数。

对我来说,这是非常令人困惑的,我不得不花很多时间弄清楚这std::codecvt不会对非文件 I/O 流做任何事情。

是否有任何原因std::codecvt没有被继承的所有类使用std::ostream

此外,有没有人知道我可以依靠哪些结构来实现压头?

编辑:这是我所指语言的一部分:

通过 std::basic_fstream 执行的所有文件 I/O 操作使用流中灌输的语言环境的 std::codecvt<CharT, char, std::mbstate_t> 方面。

来源:https : //en.cppreference.com/w/cpp/locale/codecvt


更新 1:

我做了一个小例子来说明我的问题:

#include <iostream>
#include <locale>
#include <fstream>
#include <sstream>

static auto invocation_counter = 0u;

struct custom_facet : std::codecvt<char, char, std::mbstate_t>
{ …
Run Code Online (Sandbox Code Playgroud)

c++ file facet ostream codecvt

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

如何通过可变参数模板表达概念?

我想定义一个概念,只有具有特定类型值的元组才能满足。

让我们说简单起见,我只想接受仅包含数字类型元素的元组。我该怎么做?

例如

std::tuple<int16_t, int32_t> // satisfies concept
std::tuple<std::string, double> // doesn't satisfy concept
Run Code Online (Sandbox Code Playgroud)

问题是我必须制定类似“for_each_type”的内容。也不允许递归概念。

c++ tuples variadic-templates c++-concepts c++20

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

模板成员变量取决于规则

在以下代码中:

#include <iostream>
#include <tuple>

template<typename T>
struct Container
{
  std::string id;
  T value;

  Container(std::string id, T value) : id(id), value(value) {}
};

template<typename... T>
struct ElementCodec
{
  std::tuple<T...> values;

  ElementCodec(T... args) : values(args...) {}
};

template<typename... T> ElementCodec(T...) -> ElementCodec<T...>;

int main()
{
  ElementCodec a { int { 5 }, double { 3. }, Container { "52", 7 } };
  auto [x, y, container] = a.values;

  std::cout << x << ", " << y << ", " << container.value …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic-templates c++17

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