链接的模板模板参数-将内部参数约束为相同
Linked template template parameters - constraining the inner parameter to be the same
我有一些代码大量使用模板类。在这一点上,更改现有的代码库是可能的,但并不可取。我需要编写一个新的类,它将作用于两个模板类,除了有一个公共的模板参数外,这两个模板(就这个问题而言)是任意的。一个简化的例子:
template<typename T>
class A {
// Implementation details
};
template<typename T>
class B {
// Implementation details
};
template<typename T, typename X<T>, typename Y<T>> // This syntax is invalid!
class C {
// Implementation details
};
我需要写C
课。示例中显示的语法暗示了我想做什么,但不起作用。此处的模板参数X
和Y
必须通过采用相同的模板参数T
"绑定在一起"。除此之外,它们可以是任意的。
这意味着类似C<std::string,A<std::string>,B<std::string>>
的内容应该有效,但C<std::string,A<std::string>,B<std::map>>
不应该有效,因为A
和B
没有相同的模板参数。(引号中的"like"再次表示上述C
声明中的语法仍然错误。)
其他尝试(也失败了)包括:
template<typename T, template<typename> class X<T>, template<typename> class Y<T>>
template<typename T> template<typename X<T>, typename Y<T>>
这样的事情有可能吗?如果是,语法是什么?
谢谢!
您可以部分专门化C
:
//Primary template
template<typename T, typename X, typename Y>
class C;
//Specialization for when the template parameters are the same
template<typename T, template <typename> class X, template <typename> class Y>
class C <T, X<T>, Y<T>> {
// Implementation details
};
如果使用无效的模板参数,则会出现编译时错误。
实时演示
扩展对TartanLlama接受的答案的注释,我能够稍微改进一下,这样就少了一个模板参数。这导致代码稍微简单一些。
主模板变成
template<typename X, typename Y> class C
专业化是
template<template<typename> class X, template<typename> class Y, typename T> class C<X<T>, Y<T>>
这里的区别在于,相对于TartanLlama最初提出的内容,主模板没有额外的模板参数T
。
相关文章:
- 函数作为模板参数,是否对返回类型强制约束
- SFINAE 内部概念模板参数
- 作为模板模板参数的内部模板类
- 如何将从第 2 个字符开始的字符串作为函数中的参数传递以进行递归,并约束数据 tiee 是函数中的字符串?
- 带有约束的可变参数模板的'requires'表达式的语法是什么?
- 将约束组合应用于参数包
- 约束模板参数顺序的更简单方法
- 自动参数如何在内部工作
- 如何使结构内部的可变参数模板可以在外部访问?
- 如何处理可能指向内部数据的参考参数
- 如何从对象内部的 typedef 获取模板参数类型
- 如何约束参数类型以仅允许 std::initializer_list<size_t> 或 std::array<size_t, N>?
- 约束类型模板参数仅对特定模板进行实例化
- 约束模板参数取决于传递的函子
- 是定义的函数参数的内部执行顺序
- 用相同的参数将内部和外部构造函数分开
- 链接的模板模板参数-将内部参数约束为相同
- "std::string"还是"const std::string&"论点?(参数在内部复制和修改)
- 使用noexcept作为lambda修饰符或参数约束
- 如何传递"int X::*"为模板函数参数的内部类型定义?