【问题标题】:SFINAE based on type name基于类型名称的 SFINAE
【发布时间】:2017-11-17 09:46:36
【问题描述】:

在我的搜索中,我找到了根据成员函数的存在来选择模板扩展的方法,如果类型是整数等,但我想做的是基于类型名称拥有类似 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 做的所有疯狂的事情,这似乎应该很容易或至少是可能的,但我不知道该怎么做。

【问题讨论】:

    标签: c++ sfinae


    【解决方案1】:

    您可以为此使用std::is_same&lt;T, U&gt;

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

    【讨论】:

    • @tobi303 是的......他们只是别名。这里没有什么令人惊讶的。就其价值而言,名称并非完全无关紧要:struct A { int x; };struct B { int x; }; 是不同的类型。 using C = A; 引入了一个新名称 C,它是类型 A 的别名。
    • 抱歉,我想我只是误读了这个问题,OP 根本没有谈论类型的名称,而只是指typename T
    猜你喜欢
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2022-06-20
    • 2014-05-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多