很容易表达“类型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

最佳答案

c++中许多不可能的事情一样,这等效于解决Halt。

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

赖斯定理说这是不可能的。

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

现在,您可以随身携带模板,并对照特定类型对其进行检查。但是在足够复杂的程序中,这很像是要解决的问题概念。接口(interface)错误,而不是深入实现。

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

10-10 09:41
查看更多