SFINAE基于类型名称

时间:2017-11-17 09:46:37

标签: c++ sfinae

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

1 个答案:

答案 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 {};