【问题标题】:C++ class template taking either type or non-typeC++ 类模板采用类型或非类型
【发布时间】:2022-01-11 23:01:20
【问题描述】:

我看到了一些类似的问题,但他们似乎没有明白这一点。

我可以在模板上重载一个函数:

template <typename T> void foo(); // Called as e.g., foo<int>();
template <std::size_t I> void foo(); // Called as e.g., foo<2>();

有没有办法对班级做类似的事情,我可以有MyClass&lt;int&gt;MyClass&lt;2&gt;

我看不出有什么办法。 (我的真正目标是拥有一个可调用的 static constexpr 实例,其行为类似于 std::get。而 std::get 在其“索引”参数和参数类型上被模板化,我想制作一个可调用的就其本身而言,所以myns::get&lt;2&gt;myns::get&lt;int&gt; 都是可调用的,并且在调用时的行为分别类似于std::get&lt;2&gt;(tup)std::get&lt;int&gt;(tup)

您天真地希望这样的事情会起作用,但 auto 是一种类型:

template <auto IndOrType>
constexpr auto get = [](auto&& tup) {
    return std::get<IndOrType>(std::forward<decltype(tup)>(tup));
};

我可以创建一个返回 lambda 的 getter 函数,然后使用 () 调用它,如 myns::get&lt;2&gt;()(tup)myns::get&lt;int&gt;()(tup)

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    您可以使用帮助器类型std::integral_constant&lt;int,N&gt; 专门化该类。虽然不幸的是,这并不完全允许 ​​MyClass&lt;2&gt; 语法:

    #include <type_traits>
    
    template<typename T>
    class MyClass
    {
    };
    
    template<int N>
    using ic = std::integral_constant<int,N>;
    
    template<int N>
    class MyClass<ic<N>>
    {
    
    };
    
    int main()
    {
        MyClass<int> a;
        MyClass<ic<2>> b;
    }
    

    https://godbolt.org/z/84xoE1Yd4

    【讨论】:

    • 对。如果有办法让2 在那种情况下隐式转换为ic&lt;2&gt;...
    • 是的,我希望它可以自动匹配专业化,但是唉。
    • 顺便说一句,我不完全确定您的预期用例。但是重载函数makeMyClass 不能工作吗?不要直接命名类型,而是让重载函数对 MyClass 的任一版本进行特化。
    • 我真的只是希望在语法上做auto f = get&lt;X&gt;; f(t); 并让它像std::get&lt;X&gt;(t); 一样,这似乎很自然。看起来很简单,但要做到这一点,我发现自己觉得这是可能的,所以我认为这是一个很好的问题。
    • 似乎函数模板是唯一可以在前导模板参数上重载的东西,所以最终可能无法像这样重载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    相关资源
    最近更新 更多