我可以为不同的类型集定义模板吗?
Can I define templates for different sets of types?
我需要编写一个模板函数,它的行为会根据其参数的 class 而有所不同:
template<class ContainerType>
bool myFunc(ContainerType in){
//do some stuff
}
template<class NotAContainerType>
bool myFunc(NotAContainerType in){
//do something else
}
我仅限于 C++11,所以 static_if
不在 table 范围内。此外,ContainerType
和 NotAContainerType
的 classes 确实很大,将来可能会发生变化,因此仅手动添加一些异常作为模板特化也不明智。
我知道 std::enable_if
解决方法,但如果我需要将它应用于两组相互不同的 classes,我该如何使用它?
Create a traits for your concept Container,那么,你可能会用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
}
或代码调度
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>{});
}
我需要编写一个模板函数,它的行为会根据其参数的 class 而有所不同:
template<class ContainerType>
bool myFunc(ContainerType in){
//do some stuff
}
template<class NotAContainerType>
bool myFunc(NotAContainerType in){
//do something else
}
我仅限于 C++11,所以 static_if
不在 table 范围内。此外,ContainerType
和 NotAContainerType
的 classes 确实很大,将来可能会发生变化,因此仅手动添加一些异常作为模板特化也不明智。
我知道 std::enable_if
解决方法,但如果我需要将它应用于两组相互不同的 classes,我该如何使用它?
Create a traits for your concept Container,那么,你可能会用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
}
或代码调度
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>{});
}