c++模板可变但静态
C++ Templates variadic but static
我在c++中训练我的模板技能,并想实现一个向量类。类由向量维N和类型T定义。现在我想要一个构造函数,它正好有N个类型为T的变量。然而,我不能得到我的头围绕如何告诉可变模板只接受N个参数。也许这是可能的模板专门化?还是我想错方向了?如有任何意见,我将不胜感激。
更多想法
我已经看到的所有关于可变模板的例子都使用递归来"迭代"参数列表。然而,我想到的是构造函数不能从构造函数调用(阅读答案中的评论)。所以也许在构造函数中使用可变模板是不可能的?无论如何,这只会推迟我使用工厂函数来解决相同的基本问题。
一个可变的构造函数似乎是合适的:
template<typename T, int Size>
struct vector {
template<typename... U>
explicit
vector(U&&... u)
: data {{ std::forward<U>(u)... }}
{
static_assert( sizeof...(U) == Size, "Wrong number of arguments provided" );
}
T data[Size];
};
这个例子使用完全转发和和static_assert
来生成硬错误,如果不完全Size
参数传递给构造函数。这可以调整:
- 可以使用
std::enable_if
(触发SFINAE)将硬错误转换为软错误;我不推荐它 - 您可以将条件更改为
sizeof...(U) <= Size
,让剩余元素进行值初始化 - 你可以要求传递给构造函数的类型可以转换为
T
,或者完全匹配,例如T const&
;将违规变为硬错误(再次使用static_assert
)或软错误(再次使用SFINAE)
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++中使用非静态成员函数作为回调函数
- 将静态库链接到不带-fPIC的共享库中
- 静态结构和一个定义规则
- 为什么虚函数不能是静态的和全局的?
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身