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