【发布时间】:2013-12-30 22:52:44
【问题描述】:
N3580 描述了以下场景:
template<Object T, template<Object> Cont>
struct stack {
Cont<T> container;
};
template<Object>
struct my_vector;
template<Regular>
struct my_list;
template<typename>
struct my_magic;
这里,Regular 是Object 的细化;也就是说,每个Regular 都是一个
Object 但不是每个Object 都是Regular。
我希望类型系统能够使stack<X, Y> 有效,
X 必须是 Object 并且 Y 必须可以用 Object 实例化。这
意味着stack<int, my_vector> 和stack<int, my_magic> 是有效的,
而stack<int, my_list> 不是。很像普通函数的情况:
struct Base {};
struct Derived : Base {};
void foo(Base* p, function<void(Base*)> fun) {
fun(p);
}
template<typename T>
void bar(T*);
我希望如果p 是Base*,那么foo(p, bar<Base>) 和foo(p,
bar<void>) 是有效的,而foo(p, bar<Derived>) 不是;毕竟,一个
Base* 隐式转换为void*,但没有转换为Derived*。
但是,在模板的情况下,情况正好相反。仅有的
允许stack<int, my_vector> 和stack<int, my_list>,而禁止stack<int,
my_magic>。为什么是这样? my_magic 适用于任何类型,
而my_list 可能会失败,具体取决于我给它的对象。此外,我可以
让my_magic 只使用对象:
template<Object T>
struct my_restricted_magic : my_magic<T> {};
现在my_restricted_magic 可以与stack 一起使用。另一方面,有
制作一个接受任何类型的my_list 并不容易,但这正是
现在允许将它作为模板模板参数传递。
我是否误解了模板模板参数约束的目的 参数?
【问题讨论】:
-
@KerrekSB N3580 是 C++1y 论文。
Bar有一个类型参数,受Object概念约束。 -
@Yakk:哦,我明白了。我实际上读过一次。 (虽然它不是 in C++1y,是吗?)
-
@KerrekSB 不,这将是一个单独的 TS。
-
我对这个问题有点困惑。你认为你的最后一行应该被允许吗?为什么?
-
@sftrabbit:我希望传递模板模板的工作方式与传递函数非常相似,而实际上恰恰相反。基本上,我期望逆变,但得到协方差。
标签: c++ templates constraints c++14