我可以为不同的类型集定义模板吗?

Jon*_*ove 13 c++ templates template-specialization enable-if c++11

我需要编写一个模板化函数,根据其参数的类别,它的行为会有所不同:

template<class ContainerType>
bool myFunc(ContainerType in){
//do some stuff
}

template<class NotAContainerType>
bool myFunc(NotAContainerType in){
//do something else
}
Run Code Online (Sandbox Code Playgroud)

我被限制在C++ 11中,所以static_if不在桌面上.此外,类的ContainerTypeNotAContainerType非常大,并且可能在将来发生变化,因此只需手动添加一些例外作为模板特化也是不明智的.

我知道std::enable_if解决方法,但是如果我需要将它应用于两个相互不同的类集,我该如何使用它?

Jar*_*d42 20

为您的概念容器创建特征,然后,您可以使用SFINAE

template <typename T>
typename std::enable_if<is_container<T>::value, bool>::type
myFunc(T in){
    //do some stuff
}

template <typename T>
typename std::enable_if<!is_container<T>::value, bool>::type
myFunc(T in){
    //do some stuff
}
Run Code Online (Sandbox Code Playgroud)

或标签调度

namespace details
{

    template <typename T>
    bool myFunc(T in, std::true_type){
        //do some stuff
    }

    template <typename T>
    bool myFunc(T in, std::false_type){
        //do some stuff
    }

}


template <typename T>
bool myFunc(T in){
    return details::myFunc(in, is_container<T>{});
}
Run Code Online (Sandbox Code Playgroud)