C++ 我可以使用模板参数作为变量吗?
我想根据模板参数分配内存,如下所示:C++ 我可以使用模板参数作为变量吗?,c++,templates,generic-programming,C++,Templates,Generic Programming,我想根据模板参数分配内存,如下所示: enum类型标志{ kFloat32=0, kFloat64=1, kFloat16=2, kUint8=3, kInt32=4, kInt8=5, kInt64=6, kBool=7, kInt16=8 }; 模板 内联TBlob::TBlob(const size_t&size):shape_{size}{ 开关(数据类型){ 案例32: dptr_=新浮动[大小]; 打破 案例kFloat64: dptr=新的双[尺寸]; 打破 ... 编译器会抛出
enum类型标志{
kFloat32=0,
kFloat64=1,
kFloat16=2,
kUint8=3,
kInt32=4,
kInt8=5,
kInt64=6,
kBool=7,
kInt16=8
};
模板
内联TBlob::TBlob(const size_t&size):shape_{size}{
开关(数据类型){
案例32:
dptr_=新浮动[大小];
打破
案例kFloat64:
dptr=新的双[尺寸];
打破
...
编译器会抛出如下错误:
error: expected primary-expression before ‘)’ token
switch(dtype){
^
我能在保持
dtype
的相同含义的同时实现我的目标吗?你当然能。我猜你现在的定义是这样的
template<typename dType> ... everything else
模板…其他一切
您应该将其更改为非类型参数,它将按预期工作
template<int dType> ... rest of definition
模板…定义的其余部分
或
模板…定义的其余部分
应根据您的语言版本工作
你可以进一步阅读。你当然可以。我猜你现在的定义是这样的
template<typename dType> ... everything else
模板…其他一切
您应该将其更改为非类型参数,它将按预期工作
template<int dType> ... rest of definition
模板…定义的其余部分
或
模板…定义的其余部分
应根据您的语言版本工作
您可以进一步阅读。似乎要将非模板(枚举器)参数映射到类型:
#include <cstddef>
// Platform-independent type descriptions.
enum class TypeFlag {
kFloat32 = 0,
kFloat64 = 1
// ...
};
// Platform-specific TypeFlag to type mapping.
template<TypeFlag FLAG>
struct MappedType;
// Specialize type mapping for the platform-independent
// type representations (TypeFlag) that can be represented
// on this particular platform.
template<>
struct MappedType<TypeFlag::kFloat32> { using type = float; };
template<>
struct MappedType<TypeFlag::kFloat64> { using type = double; };
// ...
template<TypeFlag FLAG>
using MappedType_t = typename MappedType<FLAG>::type;
template<TypeFlag FLAG, std::size_t SIZE>
struct TBlob {
using BlobType = MappedType_t<FLAG>;
TBlob() {
dptr_ = new BlobType[SIZE];
}
// ...
private:
BlobType* dptr_;
};
#包括
//与平台无关的类型描述。
枚举类类型标志{
kFloat32=0,
kFloat64=1
// ...
};
//平台特定的TypeFlag到类型映射。
模板
结构映射类型;
//专门化独立于平台的类型映射
//可以表示的类型表示(TypeFlag)
//在这个平台上。
模板
结构MappedType{using type=float;};
模板
结构MappedType{using type=double;};
// ...
模板
使用MappedType\u t=typename MappedType::type;
模板
结构TBlob{
使用BlobType=MappedType\u t;
TBlob(){
dptr_u2;=新BlobType[大小];
}
// ...
私人:
BlobType*dptr;
};
请注意,
double
在所有目标体系结构上都不一定是64位浮点,因此这种方法不一定是可移植的,可以说是进入特定于平台的类型映射。似乎您希望将非模板(枚举器)参数映射到一种类型:
#include <cstddef>
// Platform-independent type descriptions.
enum class TypeFlag {
kFloat32 = 0,
kFloat64 = 1
// ...
};
// Platform-specific TypeFlag to type mapping.
template<TypeFlag FLAG>
struct MappedType;
// Specialize type mapping for the platform-independent
// type representations (TypeFlag) that can be represented
// on this particular platform.
template<>
struct MappedType<TypeFlag::kFloat32> { using type = float; };
template<>
struct MappedType<TypeFlag::kFloat64> { using type = double; };
// ...
template<TypeFlag FLAG>
using MappedType_t = typename MappedType<FLAG>::type;
template<TypeFlag FLAG, std::size_t SIZE>
struct TBlob {
using BlobType = MappedType_t<FLAG>;
TBlob() {
dptr_ = new BlobType[SIZE];
}
// ...
private:
BlobType* dptr_;
};
#包括
//与平台无关的类型描述。
枚举类类型标志{
kFloat32=0,
kFloat64=1
// ...
};
//平台特定的TypeFlag到类型映射。
模板
结构映射类型;
//专门化独立于平台的类型映射
//可以表示的类型表示(TypeFlag)
//在这个平台上。
模板
结构MappedType{using type=float;};
模板
结构MappedType{using type=double;};
// ...
模板
使用MappedType\u t=typename MappedType::type;
模板
结构TBlob{
使用BlobType=MappedType\u t;
TBlob(){
dptr_u2;=新BlobType[大小];
}
// ...
私人:
BlobType*dptr;
};
请注意,
double
在所有目标体系结构上都不一定是64位浮点值,因此这种方法不一定是可移植的,可以说是平台特定的类型映射。是的,但目前编写的模板参数是类型名称,而不是值。请尝试使用template
您不想将其用作变量可以。您想使用值模板参数而不是类型模板参数。对于类似变量的参数,您可以使用引用。@paddy它可以工作!谢谢!@IllidanS4支持Monica是的!您的描述更准确,我从您的建议中学到了很多。非常感谢!是的,但就目前编写的情况而言,您的模板参数是类型参数e、 不是值。请尝试template
您不想将其用作变量。您想使用值模板参数而不是类型模板参数。对于类似变量的参数,您可以使用引用。@paddy它可以工作!谢谢!@IllidanS4支持Monica Yes!您的描述更准确,我从您的建议中学习到了。谢谢太多了!谢谢!真的很有帮助!谢谢!真的很有帮助!谢谢你详细的回答!它帮助我学到了这个问题以外的更多知识。谢谢你详细的回答!它帮助我学到了这个问题以外的更多知识。