C 模板功能是否有任何方法可以采用n个参数
Is there any way for a C++ template function to take exactly N arguments?
我的意思是,例如,类似类的构造函数:
class vector<size_t N, typename FLOAT=double> {
vector(FLOAT ...x) {} // I want exactly N arguments here
};
我希望我很明显,我做不是想要一个变异函数,而是一个函数,当n在compile time中知道n时,恰好 n参数。因此,使用上面的示例,vector<3>(1.5, 2.5)
应产生编译时错误,而vector<2>(1.5, 2.5)
应编译并运行。
这是可能的吗?
我认为也许可以使用参数包来完成,但是我不太确定如何。
在某种程度上,您可以做类似的事情:
template <std::size_t, typename T> using alwaysT = T;
template <typename FLOAT, typename Seq> struct vector_impl;
template <typename FLOAT, std::size_t... Is>
struct vector_impl<FLOAT, std::index_sequence<Is...>> {
vector_impl(alwaysT<Is, FLOAT>... floats) { /*...*/}
};
template <std::size_t N, typename FLOAT>
using vector = vector_impl<FLOAT, std::make_index_sequence<N>>;
最简单的方法可能只是使用 static_assert
。适当地添加图案匹配:
template<int N, typename... Args>
void foo(Args... args) {
static_assert(sizeof...(args) == N, "Incorrect number of arguments");
// stuff
}
这大部分时间都会做,甚至允许您遇到一个友好的自定义错误。
您甚至可以发疯,并使用foldexprs对参数应用更多约束:
static_assert(((std::is_integral_v<Args>) && ...), "All arguments must be integers");
与基于Sfinae的解决方案相比,这种方法的价值是您可以获得更少的疯狂编译错误。
如果使用C 20,则可以使用新的requires
关键字以更强大/友好的方式应用相同的概念。
相关文章:
- 使用在用于SFINAE的void_t中具有参数的方法
- 如何制作一个将函数作为参数的类方法
- c++方法参数只能在linux的发布模式下自行更改
- 使用用户定义的参数调用future/async并调用类方法
- 将成员函数指针作为参数传递给模板方法
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 具有字符串化的可变参数宏的现代/通用方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- 如何在方法中传递结构参数
- 如何将类成员方法的参数列表自动填充写入可变参数?
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- C++接口继承不同的参数方法
- C++ 模板:重载时找不到基类类型参数方法
- 如何使用迭代器作为参数方法?
- 具有不同亚型的参数方法
- 如何以相同的方法在子类中超载的相同方法来实现工作变量参数方法
- 如何将 C 中声明的可选参数方法转换为 c++
- 如果模板化"ResourceCache"需要不同的创建参数/方法,它们如何加载/创建 T 类型的资源?