繁体   English   中英

如何根据成员变量的存在模板专门化 function

[英]How to template specialize a function based on member variable existence

这是我想要的一个简单示例,但我不知道如何使这些功能明确无误。 我正在使用 echo 来检查 SFINAE 的成员变量类型的完整性,并使用 echo back void 作为返回类型。

// Example program
#include <iostream>
#include <string>
#include <type_traits>

namespace detail {
    struct X {
        int x;
    };
    
    struct Y {
        int y;
    };
    
    template <typename V, typename... T>
    using echo = V;
    
    template <typename T>
    echo<void, decltype(std::declval<T>().x)> template_print(T& t) {
        std::cout << "x = " << t.x << std::endl;
    }
    
    template <typename T>
    echo<void, decltype(std::declval<T>().y)> template_print(T& t) {
        std::cout << "y = " << t.y << std::endl;
    }
}

int main()
{
    detail::X a{.x = 1};
    detail::Y b{.y = 2};
    detail::template_print(a);
    detail::template_print(b);
    return 0;
}

我不认为这是一个含糊不清的问题,而是一个重新定义的问题。

如果您将echo别名模板的实现从“直接”更改为“间接”,则可以解决您遇到的问题,如以下代码片段所示。

template <typename T, typename... Ts>
struct Echo
{
    using type = T;
};
template <typename T, typename... Ts>
using echo = typename Echo<T, Ts...>::type;

请注意,有些人可能会建议您使用std::void_t ,但这在这里也行不通 - 出于完全相同的原因。

这个问题有点复杂,但您可以通过使用间接别名模板(如上面最终解析为嵌套类型的模板)而不是直接别名模板来避免它。

冒着让我自己说话的风险,我唯一看到过对此的任何解释的地方是这个CppCon 2021 视频的第一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM