我刚刚了解了 C++ 中的可变参数模板。我实现了它,但我想知道它可以执行以下操作吗?
如果我想要一个参数数量可变的函数,我可以这样做:
template <typename... Ts>
f(Ts... args);
但我失去了类型安全(我不知道参数的类型)。
如果我知道我的函数只需要怎么办float
作为论据?我想在编译时确保每个参数都是我想要的类型。
所以这些是我的问题:
-
有没有办法用可变参数模板强制某种类型(类似这样)?
template <float... Fs>
f(Fs... args); // unlimited number of arguments but only float
-
如果没有,有没有办法在编译时检查它?static_assert(std::is_same<A,B>)
在大多数情况下都很好,但它不适用于模板化类(就像我的用例):
template <typename T, uint16_t dimension>
class Vector
{
template <typename... Ts>
Vector(Ts... args)
{
static_assert(sizeof...(args) == dimension);
static_assert(std::is_same_v<Ts..., T>()); //doesn't work because Ts will
//develop into a lot of template
//arguments. Just putting Ts doesn't
//work either.
}
}
PS:是的,我可以使用std::vector
or std::array
作为论点,但这不是重点。另外,我想保持美丽Vector(2.0, 1.0, 0.0)
语法,不使用花括号。
template <typename T, uint16_t dimension>
class MyVector
{
public:
template <typename... Ts>
MyVector(Ts... args)
{
static_assert(sizeof...(args) == dimension);
static_assert((std::is_same<T,Ts>::value && ...) );
}
};
还可以使用 C++17 中提供的一元右折叠表达式https://en.cppreference.com/w/cpp/language/fold https://en.cppreference.com/w/cpp/language/fold
这本质上是
std::is_same<T,Ts_1>::value && ( std::is_same<T,Ts_2>::value && ... std::is_same<T,Ts_n>::value ) ...)
当参数包 Ts 为空时也有效。引用自参考链接:
" Logical AND (&&). The value for the empty pack is true"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)