基于类型名称的 SFINAE
SFINAE based on type name
在我的搜索中,我找到了根据成员函数的存在、类型是否完整等来选择模板扩展的方法,但我想做的是根据类型名称选择类似 SFINAE 的东西。看取自另一个问题的例子:
template<typename T>
std::enable_if_t<std::is_integral<T>::value> f(T t){
//integral version
}
这让我根据类型 T 是否为整数进行选择。我想做的是,假设我定义了几个 类; gl_renderable_t
、vulkan_renderable_t
等。我想要类似的东西;
template<typename T>
std::enable_if_t<!T.has_typename(gl_renderable_t)!::value> f(T t){
// call gl render functions
}
template<typename T>
std::enable_if_t<!T.has_typename(vulkan_renderable_t)!::value> f(T t){
// call vulkan render functions
}
我想基本使用基于typename的SFINAE。考虑到人们使用 SFINAE 所做的所有疯狂事情,这似乎应该很容易或至少是可能的,但我不知道该怎么做。
您可以为此使用 std::is_same<T, U>
:
template <typename T>
std::enable_if_t<std::is_same_v<gl_renderable_t, T>> f(T t);
注意:std::is_same
的工作原理是让一个基本模板接受 T, U
和 T, T
的部分特化需要相同的类型。专业化提供 true
值,基础具有 false
值:
template<class T, class U>
struct is_same : std::false_type {};
template<class T>
struct is_same<T, T> : std::true_type {};
在我的搜索中,我找到了根据成员函数的存在、类型是否完整等来选择模板扩展的方法,但我想做的是根据类型名称选择类似 SFINAE 的东西。看取自另一个问题的例子:
template<typename T>
std::enable_if_t<std::is_integral<T>::value> f(T t){
//integral version
}
这让我根据类型 T 是否为整数进行选择。我想做的是,假设我定义了几个 类; gl_renderable_t
、vulkan_renderable_t
等。我想要类似的东西;
template<typename T>
std::enable_if_t<!T.has_typename(gl_renderable_t)!::value> f(T t){
// call gl render functions
}
template<typename T>
std::enable_if_t<!T.has_typename(vulkan_renderable_t)!::value> f(T t){
// call vulkan render functions
}
我想基本使用基于typename的SFINAE。考虑到人们使用 SFINAE 所做的所有疯狂事情,这似乎应该很容易或至少是可能的,但我不知道该怎么做。
您可以为此使用 std::is_same<T, U>
:
template <typename T>
std::enable_if_t<std::is_same_v<gl_renderable_t, T>> f(T t);
注意:std::is_same
的工作原理是让一个基本模板接受 T, U
和 T, T
的部分特化需要相同的类型。专业化提供 true
值,基础具有 false
值:
template<class T, class U>
struct is_same : std::false_type {};
template<class T>
struct is_same<T, T> : std::true_type {};