Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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_Generic Programming - Fatal编程技术网

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!您的描述更准确,我从您的建议中学习到了。谢谢太多了!谢谢!真的很有帮助!谢谢!真的很有帮助!谢谢你详细的回答!它帮助我学到了这个问题以外的更多知识。谢谢你详细的回答!它帮助我学到了这个问题以外的更多知识。