Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 应用部分应用的模板_C++_Templates - Fatal编程技术网

C++ 应用部分应用的模板

C++ 应用部分应用的模板,c++,templates,C++,Templates,有一个像a这样的类,有没有办法将它应用到像B这样的模板上,将T2设置为某种类型的C?但不创建另一个从A继承的模板类 模板 甲级 { }; 模板 B类 { }; 是的,您可以使用C++11的别名模板: template <typename T> using AA = A<T, C>; B<AA> b; 模板 使用AA=A; B使用C++11使用模板别名工作: template<typename T1, typename T2> class A {

有一个像a这样的类,有没有办法将它应用到像B这样的模板上,将T2设置为某种类型的C?但不创建另一个从A继承的模板类

模板
甲级
{ };
模板
B类
{ };

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

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

B<AA> b;
模板
使用AA=A;

B

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

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;
}
模板
甲级
{ };
模板
B类
{ };
C类
{ };
使用A1=A的模板;
int main()
{
BB;
}
如果没有C++11,您将只剩下您可能已经知道的内容:

template< typename T > class A1 : A< T, C > {};
templateclass A1:A{};

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

如果你写:

template <typename T> struct B {};

C++标准分配模型是使用内部<代码> ReBeX/<代码>结构:

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(); }
};
模板
结构简单{
模板
结构重新绑定{typedef Simple type;};
};
模板
结构多{
模板
结构重新绑定{typedef Multi-type;};
};
模板
构造某物{
模板
void doit(){typedef typename A::rebind::type B;B::doit();}
};
请注意如何在
rebind
中使用复杂的计算,并且没有任何东西强迫您盲目地将接收到的类型作为参数传递


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

因此没有好的解决方案,C++没有其他解决方案,这就是为什么我们现在使用并使用C++ 11:是的,20年处理数百个问题最终带来了一些解决方案。再过10年,它们将在编译器中完全实现很早以前,标准化人员就应该把这种语言带入坟墓。虽然这里不是讨论的地方,但我只是添加了一条评论:我更喜欢慢慢来,因为通过添加用户要求的每一个小“功能”,打破一种语言要容易得多。20年来,我看到了语言和技术的不断出现,但C++仍然在这里,比以往任何时候都更强大。我知道这些说法。但我很确信,它们是假的。20年不是思考和解决上述问题的适当时间。不是说,这应该在模板的一开始就解决。在概念的预览分析过程中,您很容易看到这一点很抱歉,这里没有讨论,但是我没有什么选择可以回复。每次我给出另一个C类型时,我只需要转发所有构造函数。太好了。实际上T1是由B类在我的情况下提供的。-是的,希望参数是一个实现细节。B类实际上是一个内存管理器,我希望它能够使用不同的内存分配策略。但我对在运行时传递这些策略并不感兴趣我非常关心每一条指令,所以我想静态地传递我能传递的任何指令。@Number47:我明白了,我编辑了我的答案,提供了STL用来从
std::allocator
切换到
std::allocator
内部(例如)的
rebind
技巧。很好的解决方案。:)非常感谢。
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(); }
};