簡體   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