我想编写一个函数,该函数将根据函数的类型而不是参数进行操作。因此,该函数不会接收基于模板的参数。一般要点是这样的:
#include <iostream>
void func() {
std::cout<<"End marker\n";
}
template <typename Type, typename... T>
void func() {
std::cout<<"Type sizeof "<<sizeof(T)<<"\n";
func<T...>();
}
int main() {
func<int, int, int>();
}
当然不会编译。我尝试这样做:
template <typename Type, typename... T>
void func() {
std::cout<<"Type sizeof "<<sizeof(T)<<"\n";
if( sizeof...(T)!=0 )
func<T...>();
}
但是,这不起作用。 func<T...>
可能没有得到评估,但确实需要编译。
我有没有办法做到这一点?
您可以通过使func
成为“模板函数”(实际上并不使用模板)来使原始设置生效,例如:
template<int = 0>
void func() {
std::cout<<"End marker\n";
}
template <typename Type, typename... T>
void func() {
std::cout<<"Type sizeof "<<sizeof(Type)<<"\n";
func<T...>();
}
而且您的第二个可以通过使用if constexpr
来工作,因此func<>()
不会被编译。
您可以使非模板函数func
成为可变参数模板函数,该函数接受零个模板参数。然后,当参数数量不为零时,让SFINAE移开此模板函数。
以下应该起作用:
#include <iostream>
#include <type_traits>
template <typename... Ts>
typename std::enable_if<sizeof...(Ts) == 0>::type func() {
std::cout<<"End marker\n";
}
template <typename T, typename... Ts>
void func() {
std::cout << "Type sizeof " << sizeof...(Ts) + 1 << "\n";
func<Ts...>();
}
int main() {
func<int, int, int>();
}
检查live