链接的模板模板参数-将内部参数约束为相同

Linked template template parameters - constraining the inner parameter to be the same

本文关键字:参数约束 内部 参数 链接      更新时间:2023-10-16

我有一些代码大量使用模板类。在这一点上,更改现有的代码库是可能的,但并不可取。我需要编写一个新的类,它将作用于两个模板类,除了有一个公共的模板参数外,这两个模板(就这个问题而言)是任意的。一个简化的例子:

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课。示例中显示的语法暗示了我想做什么,但不起作用。此处的模板参数XY必须通过采用相同的模板参数T"绑定在一起"。除此之外,它们可以是任意的。

这意味着类似C<std::string,A<std::string>,B<std::string>>的内容应该有效,但C<std::string,A<std::string>,B<std::map>>不应该有效,因为AB没有相同的模板参数。(引号中的"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