我有一個模板類看起來像這樣:禁用功能,當參數類型爲void
template <typename T> constexpr bool is_value_passable_v = is_trivially_copyable_v<T> && sizeof(T) <= sizeof(void*) && !is_polymorphic_v<T>;
template <typename B, typename T> using param_base_t = conditional_t<is_value_passable_v<B>, T, const T&>;
template <typename T> struct param_d
{
using type = param_base_t<T, T>;
};
template <> struct param_d<void>
{
using type = void;
};
template <typename T> using param_t = typename param_d<T>::type;
template <class TIn> class CClass
{
public:
static constexpr bool use_input_v = !is_same_v<typename TIn::input_t, void>;
using input_t = conditional_t<use_input_v, param_t<typename TIn::input_t>, void>;
enable_if_t<use_input_v> Input(input_t i);
};
這段代碼的目標是,到provde不同Input
功能不同的模板paramters。
- 與
input_t = int
模板參數應導致void Input(int i)
- 與
input_t = std::vector
模板參數應導致void Input(const std::vector& i)
- 與
input_t = void
模板參數應該刪除Input
功能
鏗鏘編譯此給出
/usr/bin/../include/c++/v1/type_traits:225:78: error: no type named 'type' in 'std::__1::enable_if<false, void>'; 'enable_if' cannot be used to disable this declaration
template <bool _Bp, class _Tp = void> using enable_if_t = typename enable_if<_Bp, _Tp>::type;
^~~
編輯1: 添加行
template <typename T> static constexpr bool use_input2_v = use_input_v;
與
template <typename T = void> enable_if_t<use_input2_v<T>> Input(input_t i)
鐺替換函數聲明之後抱怨有no matching member function for call to 'Input'
:
note: candidate template ignored: substitution failure [with T = void]: non-type template argument is not a constant expression
template <typename T = void> enable_if_t<use_input2_v<T>> Input(input_t i);
~~~~~~~~~~~~ ^
編輯2: 忘了提及,這個錯誤伴隨着模板參數的所有三種變體。
編輯3: 樣本使用情況CClass
可能是
class CInput0
{
using input_t = int;
};
class CInput1
{
using input_t = std::vector<int>;
};
class CInput2
{
using input_t = void;
};
CClass<CInput0> in0;
CClass<CInput1> in1;
CClass<CInput2> in2;
std::vector<int> i = {1, 2, 3};
in0.Input(3);
in1.Input(i);
//in2.Input() disabled
爲什麼你不只是使用'static constexpr bool use_input_v =!is_same;'? –
MikeMB
而不是use_input2_v版本? Afaik enable_if只能根據'直接'模板禁用函數。 – Uroc327
'template constexpr bool is_value_passable_v = is_trivially_copyable_v && sizeof(T)<= sizeof(void *)&&!is_polymorphic_v ;'這是什麼?它既不是功能也不是班級模板。 –
Lingxi