我一直在实现一个用于处理输出流标识的 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
我做了一个小例子来说明我的问题:
#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) 我想定义一个概念,只有具有特定类型值的元组才能满足。
让我们说简单起见,我只想接受仅包含数字类型元素的元组。我该怎么做?
例如
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”的内容。也不允许递归概念。
在以下代码中:
#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)