gpt4 book ai didi

c++ - 派生类型名

转载 作者:行者123 更新时间:2023-11-30 02:22:22 30 4
gpt4 key购买 nike

我有很多不同的函数,它们执行非常相似的操作,其中类型和大小通过函数名称编码,如下所示:

int * operation_0_0_i( int a ) {
int * result = new int[4];
/* ... */
return result;
}
int * operation_0_1_i( int a ) {
int * result = new int[8];
/* ... */
return result;
}

float * operation_0_0_f( float a ) {
float * result = new float[4];
/* ... */
return result;
}

float * operation_0_1_f( float a ) {
float * result = new float[4];
/* ... */
return result;
}

我考虑使用模板,而不是拥有这么多令人困惑的不同功能。我第一次尝试 where 模板化结构,以实现派生类型:

template< typename T >
struct A {
using type = T;
using array = std::array< T, 4 >;
};

template< typename T >
struct B {
using type = T;
using array = std::array< T, 8 >;
};

这样我就可以做类似的事情了:

template< class U, typename T >
T* operation0( T a ) {
typename U<T>::array a;
/* ... */
return a.data(); // I know, that this is unsafe. Its just for this example
}

template< class U, typename T >
T* operation1( T a ) {
typename U<T>::array a;
/* ... */
return a.data();
}

int main() {
int * res1 = operation1<A, int>( 3 );
int * res2 = operation2<B, int>( 8 );
/* ... */
return 0;
}

不幸的是,这无法编译。 g++ 告诉我

In function ‘T* operation0(T)’: error: expected nested-name-specifier before ‘U’ typename U<T>::array a;

显然,此位置的类型名称说明符是错误的。但是如果我删除那个说明符,g++ 会提示

‘U’ is not a template U<T>::array a;

有谁知道,我做错了什么?是否有更好的方法,也许是使用 std::variant?感谢您的宝贵时间;)

真诚的

最佳答案

你需要告诉你你的 U 类是模板并带 1 个参数:

template<template <class > class U, typename T >
T* operation0( T _a ) {
typename U<T>::array a;
/* ... */
return a.data();
}

关于c++ - 派生类型名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47272290/

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