不带参数的可变模板函数

问题描述 投票:0回答:1

我想编写一个函数,该函数将根据函数的类型而不是参数进行操作。因此,该函数不会接收基于模板的参数。一般要点是这样的:

#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...>可能没有得到评估,但确实需要编译。

我有没有办法做到这一点?

c++ visual-c++ variadic-templates specialization
1个回答
0
投票

您可以通过使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<>()不会被编译。


0
投票

您可以使非模板函数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

© www.soinside.com 2019 - 2024. All rights reserved.