在我的搜索中,我找到了基于成员函数的存在来选择模板扩展的方法,如果类型是完整的等等,但我想要做的是基于类型名称有类似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所做的所有疯狂事情,这似乎应该是容易的,或者至少是可能的,但我无法弄清楚如何去做。
答案 0 :(得分:3)
您可以使用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 {};