首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用部分应用模板

应用部分应用模板
EN

Stack Overflow用户
提问于 2013-09-13 16:54:46
回答 3查看 157关注 0票数 2

有一个像A这样的类,有什么方法可以将它应用于像B这样的模板,并将T2设置为某种类型的C?但是没有创建另一个从A继承的模板类。

代码语言:javascript
复制
template<typename T1, typename T2>
class A
{ };

template<template <typename T1> class T3>
class B
{ };
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-13 17:56:25

我将提出另一种解决方案:不要使用模板参数。

如果你写:

代码语言:javascript
复制
template <typename T> struct B {};

然后它可以与A<int, int>C<3>,甚至普通D一起使用。

虽然使用模板参数是可能的,但这是一个普遍的坏主意。您应该将类的模板参数视为实现细节,并应用金科玉律:不要依赖实现细节。

如果您需要访问该类型,那么可以使用关联类型(也称为T::AssociatedType)或特征(BTraits<T>::AssociatedType)。

编辑:处理模板参数的多个实例化。

假设我们想要“擦除”这样一个类的模板模板参数:

代码语言:javascript
复制
template <template <typename> class A>
struct Something {
    template <typename T>
    void doit() { A<T>::doit(); }
};

C++标准分配模型使用内部rebind结构:

代码语言:javascript
复制
template <typename T>
struct Simple {
    template <typename U>
    struct rebind { typedef Simple<U> type; };
};

template <typename T0, typename T1>
struct Multi {
    template <typename U>
    struct rebind { typedef Multi<U, T1> type; };
};

template <typename A>
struct Something {
    template <typename T>
    void doit() { typedef typename A::rebind<T>::type B; B::doit(); }
};

请注意如何在rebind中使用复杂的计算,没有什么可以强迫您盲目地传递作为参数接收的类型。

另一个(类似的)解决方案是请求一个工厂(也就是,传递给自己的对象不能使用,但它可以构建有用的对象);为了便于使用,C++容器要求它们的分配器在它们自己和工厂中都可以用于其他类型。

票数 2
EN

Stack Overflow用户

发布于 2013-09-13 17:05:35

使用使用模板别名的C++11工作:

代码语言:javascript
复制
template<typename T1, typename T2>
class A
{ };

template<template <typename T1> class T3>
class B
{ };

class C
{ };

template< typename T > using A1 = A< T, C >;

int main()
{
    B< A1 > b;
}

如果没有C++11,您可能已经知道了:

代码语言:javascript
复制
template< typename T > class A1 : A< T, C > {};
票数 3
EN

Stack Overflow用户

发布于 2013-09-13 16:56:38

是的,您可以使用C++11的别名模板来完成:

代码语言:javascript
复制
template <typename T>
using AA = A<T, C>;

B<AA> b;

实例化

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18791459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档