gpt4 book ai didi

c++ - 模板类的模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:15 24 4
gpt4 key购买 nike

我有一些模板类池:

template<int a>
class Pool{}

现在,我有另一个类,我将 Pool 的对象指针作为参数传递:

template<int a, Pool<a> &pool>
class Point{}

template<typename PoolT, PoolT &pool>
class Point{}

我能以某种方式避免第一次争论吗?例如:

template<Pool<?> &pool>
class Point{}

这是我正在做的例子:

#include <iostream>
#include <stdlib.h> /* malloc, free, rand */
using namespace std;

template<int i>
struct Pool{
int id;
};

struct FE{
static Pool<1> pool;
};

Pool<1> FE::pool;


template<typename T, T &_p>
struct C{
int id;
void* operator new(size_t size){
std::cout<<"new";
return malloc(size);
}

void test(){
std::cout << _p.id;
}
};


int main() {
FE::pool.id = 120;
C<Pool<1>, FE::pool> c;
c.test();
return 0;
}

http://ideone.com/1BRUos

最佳答案

偏特化可以解压参数1来自类型 Pool , 但没有办法声明一个模板,该模板采用对任何对象的引用并推导出类型。函数可以推导出给定对象的类型,但这样的对象不能用作非类型模板参数。

这里最好的分解可能是使客户端类型嵌套在池类型中。

template<int i>
struct Pool{
int id;

// i and the Pool type are already defined at least within this context.

template< Pool & p >
struct C{
int id;
void* operator new(size_t size){
std::cout<<"new";
return malloc(size);
}

void test(){
std::cout << _p.id;
}
};
};

int main() {
FE::pool.id = 120;
Pool<1>::C< FE::pool> c;
c.test();
return 0;
}

名字Pool<1>::C< FE::pool>如图所示仍然包含同样难看的信息,但这种因式分解更适合 typedef ,或将代码添加到分配器类型,其中相关信息在范围内很方便。

关于c++ - 模板类的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20556888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com