c++ - 如何使用概念来表达 "template T is a..."形式的条件?

标签 c++ c++-concepts c++20

很容易表达“类型 T 是 E 的容器”之类的内容:

template <class T, class E>
concept bool is_container = requires(T t, E e) {
    { t.push_back(e) } -> void;
};

template <class T, class E> requires is_container<T,E>
void moo()
{
    T t; E e;
    t.push_back(e);
}

(到底检查什么并不那么重要)。

现在我需要表达这样的条件:“对于任何类型E,T是一个容器”。

template <template<class> class T> requires is_container<T>
void moo()
{
    T<int> ti; 
    ti.push_back(1);
    T<std::string> ts;
    ts.push_back("abc"s);
}

在这种情况下我该如何编写is_container

最佳答案

就像 中许多不可能的事情一样,这相当于解决 Halt。

您有一个图灵完备语言(您的模板)中的任意函数,并希望确定函数的每个输出(模板的每个实例)是否满足某些属性。

赖斯定理表明这是不可能的。

这是图灵完备的元编程语言(如模板)的缺点之一。

现在您可以随身携带该模板并根据特定类型进行检查。但在一个足够复杂的程序中,这很像发明来解决的问题概念;错误出现在接口(interface)上,而不是深入实现中。

关于c++ - 如何使用概念来表达 "template T is a..."形式的条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47035164/

相关文章:

c++ - 为什么在 hana::中包装对按值返回的函数的调用总是规避 range::views::join 的要求?或者也许不是?

c++ - cppreference.com 中的示例无法使用 MSVC 进行编译

c++ - 我如何告诉 clang-format 缩进可见性修饰符?

c++ - C++ 概念可以用于在 C++ 中实现混合类型 min 和 max 吗?

c++ - 使用概念或 SFINAE 检查类是否具有带有 std::array 参数的模板化成员函数

c++ - 将 std::u8string 复制到 utf8 字符的 c 风格字符串中

c++ - 在 parallel_for 循环中使用 COM 对象,

c++ - 如何为返回异步结果的函数指定函数签名?

c++ - 反转行的程序不打印到标准输出

c++ - 如何使用带有 lambda 仿函数参数的 requires 子句?