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