gpt4 book ai didi

c++ - 使用可变模板参数的构造函数和函数

转载 作者:行者123 更新时间:2023-11-28 06:10:04 24 4
gpt4 key购买 nike

我想编写一个由多个维度模板化的类:

namespace detail {
enum class enabler {};
}

template<size_t dim>
class templateClass
{
public:
template<class... DimArgs, typename std::enable_if<sizeof...(DimArgs)==dim, detail::enabler>::type...>
templateClass(DimArgs... dimensions) {
// Use integers passed to the constructor, one for each dimension
}
};

detail::enabler 枚举位于 almost-static-if关联。这里它被用作第二个参数包,允许传递 0 个参数。作用域枚举没有成员,并且不能(?)被意外传递。

他们还使用 using 声明来吞下一些 typename 等部分,但我已经输入完整内容以避免必须在那里阅读。

如何使用维度 parameter pack我通过了吗?

该类(class)效果很好,例如:

templateClass<2> temp(5, 2);     // works
templateClass<3> temp(5, 2, 4); // works
templateClass<1> temp(5,2); // would give compile-time error

但也许我对我应该在这里使用/做什么有了一个(或几个)坏主意?

编辑:我找到的一种解决方案是创建一个 std::initializer_list。我可以使用 intsize_t 类来创建它,它们在这里工作得很好。但是,如果我不知道传递的参数的类型(例如,因为我的函数可以同时使用 intdouble,用于其他目的) , 有没有比以下更好的方法:

std::initializer_list<int> list{dimensions...};
for (int i : list) {
std::cout << "i = " << i << std::endl;
}

完整的工作示例:

网格.H:

#ifndef MESH_H
#define MESH_H

#include <type_traits>
#include <initializer_list>
#include <iostream>

namespace detail {
enum class enabler {};
}

template <bool Condition>
using EnableIf =
typename std::enable_if<Condition, detail::enabler>::type;

template<size_t meshDim>
class Mesh
{
public:
template<class... DimArgs, EnableIf<sizeof...(DimArgs)==meshDim>...>
Mesh(DimArgs... dimensions){
std::initializer_list<int> list{dimensions...};
for (int i : list) {
std::cout << "i = " << i << std::endl;
}
}
};
#endif // MESH_H

主要.cpp:

#include <iostream>
#include "Mesh.H"

int main()
{
Mesh<2> mesh(5, 2);
return 0;
}

使用 g++ --std=c++11 main.cpp 编译

最佳答案

可以通过将参数包放在元组中来索引参数包:

using T1 = std::tuple_element<0, std::tuple<DimArgs...>>; // Any index should work, not just 0

不过,这并不能完全解决可能的数字提升或缩小问题。我在想一些相当于 decltype(tuple_sum(dimensions...)) 的东西就可以了(前提是你可以假设它们是数字)。它可能看起来像这样(未经测试):

template<typename T>
constexpr T tuple_sum(T n) {return n;}

template<typename T, typename... Rest>
constexpr auto tuple_sum(T first, Rest... rest) {
return first + tuple_sum(rest...);
}

关于c++ - 使用可变模板参数的构造函数和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31445326/

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