gpt4 book ai didi

c++ - 有没有办法为模板函数参数定义一个类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:55 25 4
gpt4 key购买 nike

下面的代码应该表明我的意思是您是否可以在参数中使用模板化函数 typedef...

#include <vector>

struct vec2
{
float x, y;
};
struct dvec2
{
double x, y;
};

template <typename T>
void function(std::vector<T>& list, decltype(T::x) scalarVal, decltype(T::x) scalarVal2)
{

typedef decltype(T::x) scalarType;
scalarType a; // a is now a double or float depending on template argument
}

int main()
{
std::vector<vec2> vecOfVec2;
std::vector<dvec2> vecOfDvec2;
function(vecOfVec2, 0.f, 1.f);
function(vecOfDvec2, 0.0, 1.0);

}

所以你可以看到在函数中我做了一个 typedef:

typedef decltype(T::x) scalarType;

然后使用 scalarType 表示 floatdouble。如果我可以将函数的函数参数列为以下内容,我会发现它很有用:

void function(std::vector<T>& list, scalarType scalarVal, scalarType scalarVal2)

但是看起来好像 typedef 直到函数内部才创建,这是行不通的。如果这是不可能的,这是可以接受的:

(decltype(T::x) scalarVal, ...)

对于每次我在示例中显示的方式的参数?

最佳答案

And then use "scalarType" to mean either float or double. I would find it useful if I could list the function arguments of the function as:

这行不通,因为标量类型取决于 vector 类型。如果您忽略那里的类型依赖性,您怎么知道哪种类型是正确的?无论哪种方式,您都必须在某处提供您使用的 vector 类型。

If it's not possible is this acceptable to do:

(decltype(T::x) scalarVal, ...)

for the arguments each time the way I've shown it in the example?

有更好的选择。这样,您就可以使函数的接口(interface)依赖于内部数据表示,这不是建议性的。实现可能不同,实现可能会更改,并且破坏性更改会使接口(interface)以这种方式无效。此外,对于使用您的代码但不知道其内部结构的其他人来说,他/她将不得不实际检查实现细节以找出您的实际含义。相反,您可以只在每个 vector 中定义一个通用名称,即

struct dvec {
using scalarType = double;
...
};

struct vec2 {
using scalarType = float;
...
};

template <typename T>
void foo(typename T::scalarType bar) { ... }

这是整个 STL 中非常常用的模式。

关于c++ - 有没有办法为模板函数参数定义一个类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50784294/

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