我可以使用模板参数作为变量吗?

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 类型映射。