gpt4 book ai didi

c++ - 基于用户表达式在编译时参数化函数

转载 作者:行者123 更新时间:2023-11-27 23:48:28 24 4
gpt4 key购买 nike

我正在编写一个 C++11 库,用户需要在其中指定一个 struct使用和要使用的元素(按顺序)。例如:

// Declaration
struct MyData{ double x, y ,z;};
...
// Use
MyClass<MyData, y, x> myobj;
MyData mydata;
myobj.set(mydata);
...

然后,MyClass应该生成迭代参数包的不同函数,但将参数视为表达式。为此,我声明了一个带有参数包的类:

template<class T, class ... G>
class MyClass{
std::vector<double*> var;
public:
Test();
void set(T const& var_);
};

然后我不知道如何生成 set()功能。行为应该类似于以下伪代码:

 template<class T, class ... G>
void Test<T, G...>::set(T const& var_){
unsigned pos = 0;
for(unsigned i =0; i < sizeof...(G); i++)
*var[i] = var_.G(i);
}

其中,在 MyClass<MyData,y,x> 的情况下会产生:

...
*var[0] = var_.y;
*var[1] = var_.x;
...

最佳答案

在我看来,您正在寻找一种将可变指针序列作为模板参数传递给结构/类成员的方法,以及一种使用它们的方法。

将可变指针序列作为模板参数传递给结构/类成员的语法如下

template <typename T, typename U, U T::* ... Ms>
struct MyClass
{ /* something */ };

但是,在您的情况下,您已将 U 类型固定为 double,因此您可以简化如下

template <typename T, double T::* ... Ms>
struct MyClass
{ /* something */ };

要在 set() 中获取正确的值,您可以按如下方式进行操作

void set (T const & v0)
{
using unused = int[];

(void)unused { 0, (var.emplace_back(v0.*Ms), 0) ... };
}

请注意,为了简化,我将您的 var vector 更改为 double 的 vector ,而不是指向 đouble 的指针.

下面是一个完整的(简化的)例子

#include <vector>
#include <iostream>

struct MyData
{ double x, y ,z; };

template <typename T, double T::* ... Ms>
struct MyStruct
{
std::vector<double> var;

void set (T const & v0)
{
using unused = int[];

(void)unused { 0, (var.emplace_back(v0.*Ms), 0) ... };
}
};

int main ()
{
MyData md { 1.0, 2.0, 3.0 };

MyStruct<MyData, &MyData::y, &MyData::x> ms;

ms.set(md);

for ( auto const & d : ms.var )
std::cout << d << ' ';

std::cout << std::endl;

}

关于c++ - 基于用户表达式在编译时参数化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48624046/

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