基于类型名称的 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_tvulkan_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, UT, 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 {};