有没有一种方法可以根据我得到的是单个模板参数还是多个模板参数来声明类型别名?最好没有专业

Is there a way to declare a type alias based on whether i get a single or multiple template arguments? Preferably without specialization

所以这个代码块显然是行不通的(conditional out of statement scope:D);我想要的是,如果只传递了一个模板参数,我将类型别名设置为该类型,如果传递了多个,我将其设置为传入类型的元组:

 template <typename... Args>
 struct KeyPolicy
 {
     if constexpr (sizeof...(Args) == 1)
     {
         using KeyType = std::tuple_element_t<0, std::tuple<Args...>>;
     }
     else
     {
         using KeyType = std::tuple<Args...>;
     }
 
     static KeyType getKey(const Args&... args)
     {
         return KeyType{args...};
     }
 };

是的,您可以使用 <type_traits> 中的 std::conditional

#include <type_traits>
#include <tuple>

template <typename... Args>
struct KeyPolicy {
    using KeyType = std::conditional_t<
        sizeof...(Args) == 1, // condition
        std::tuple_element_t<0, std::tuple<Args...>>, // if true
        std::tuple<Args...> // if false
    >;

    static KeyType getKey(const Args&... args)
    {
        return KeyType{args...};
    }
};

您可以使用 std::conditional,例如:

template <typename... Ts>
struct KeyPolicy
{
    using KeyType = std::conditional_t<sizeof...(Ts) == 1,
                                       std::tuple_element_t<0, std::tuple<Ts...>,
                                       std::tuple<Ts...>
                                      >;
 
     static KeyType getKey(const Ts&... args)
     {
         return KeyType{args...};
     }
 };

小心,双方都被评估,所以你有时可能会欺骗做“懒惰”的评估。

注意:由于 std::tuple_element_t<0, std::tuple<>> 格式不正确,它目前因空包而失败。