我有一個模板,它采用模板模板引數和一組型別引數。僅當引數匹配時,我才想用引數實體化模板。像這樣的東西:
// can_apply_t = ???
template<template<typename...> typename Template, typename... Args>
struct test {
using type = std::conditional_t<can_apply_t<Template, Args...>, Template<Args...>, void>;
};
template<typename> struct unary_template;
template<typename, typename> struct binary_template;
static_assert(std::is_same_v< test<unary_template, int>::type, unary_template<int> >);
static_assert(std::is_same_v< test<binary_template, int>::type, void >);
我幻想它會像這樣簡單:
template<template<typename... T> typename Template, typename... Args>
struct test {
using type = std::conditional_t<sizeof...(T) == sizeof...(Args), Template<Args...>, void>;
};
...但是 clang 12 說:
錯誤:'T' 不是指引數包的名稱
uj5u.com熱心網友回復:
幻想它會像這樣簡單:
不……沒那么簡單……當你寫的時候
using type = std::conditional_t<can_apply_t<Template, Args...>,
Template<Args...>,
void>;
Template<Args...>當 testconditional_t為假時,the 也必須是可接受的型別。
如果可能,您需要can_apply_t直接回傳Template<Args...>,void否則。
我建議如下
template <template <typename...> class C, typename... Ts>
auto can_apply_f (int)
-> std::remove_reference_t<decltype(std::declval<C<Ts...>>())>;
template <template <typename...> class C, typename... Ts>
auto can_apply_f (long) -> void;
template <template <typename...> class C, typename ... Ts>
using can_apply_t = decltype(can_apply_f<C, Ts...>(0));
template <template<typename...> typename Template, typename... Args>
struct test {
using type = can_apply_t<Template, Args...>;
};
uj5u.com熱心網友回復:
如果您可以使用 C 20,概念將使事情變得更容易。
template<template<typename...> typename, typename...>
struct test {
using type = void;
};
template<template<typename...> typename Template, typename... Args>
requires requires { typename Template<Args...>; }
struct test<Template, Args...> {
using type = Template<Args...>;
};
演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/402184.html
