我可以使用模板参数作为变量吗?
Can I use template parameter as variable?
我想按照模板参数这样分配内存:
enum typeFlag {
kFloat32 = 0,
kFloat64 = 1,
kFloat16 = 2,
kUint8 = 3,
kInt32 = 4,
kInt8 = 5,
kInt64 = 6,
kBool = 7,
kInt16 = 8
};
template<typename dtype, typename ctx>
inline TBlob<dtype,ctx>::TBlob(const size_t &size): shape_{size} {
switch(dtype){
case kFloat32:
dptr_ = new float[size];
break;
case kFloat64:
dptr_ = new double[size];
break;
...
编译器抛出如下错误:
error: expected primary-expression before ‘)’ token
switch(dtype){
^
我能否在保持 dtype
相同含义的同时实现我的目标?
你当然可以。我猜你现在的定义是这样的
template<typename dType> ... everything else
您应该将其更改为 non-type 参数,它将按预期工作。要么
template<int dType> ... rest of definition
或
template<typeFlag dType> ... rest of definition
应该根据您的语言版本工作。
您可以进一步阅读 here。
您似乎想将 non-template(枚举数)参数映射到类型:
#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_;
};
请注意,double
不一定是所有目标架构上的 64 位浮点数,因此这种方法不一定是可移植的,并且可以说会进入 platform-specific 类型映射。
我想按照模板参数这样分配内存:
enum typeFlag {
kFloat32 = 0,
kFloat64 = 1,
kFloat16 = 2,
kUint8 = 3,
kInt32 = 4,
kInt8 = 5,
kInt64 = 6,
kBool = 7,
kInt16 = 8
};
template<typename dtype, typename ctx>
inline TBlob<dtype,ctx>::TBlob(const size_t &size): shape_{size} {
switch(dtype){
case kFloat32:
dptr_ = new float[size];
break;
case kFloat64:
dptr_ = new double[size];
break;
...
编译器抛出如下错误:
error: expected primary-expression before ‘)’ token
switch(dtype){
^
我能否在保持 dtype
相同含义的同时实现我的目标?
你当然可以。我猜你现在的定义是这样的
template<typename dType> ... everything else
您应该将其更改为 non-type 参数,它将按预期工作。要么
template<int dType> ... rest of definition
或
template<typeFlag dType> ... rest of definition
应该根据您的语言版本工作。
您可以进一步阅读 here。
您似乎想将 non-template(枚举数)参数映射到类型:
#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_;
};
请注意,double
不一定是所有目标架构上的 64 位浮点数,因此这种方法不一定是可移植的,并且可以说会进入 platform-specific 类型映射。