enable_if 的模板专业化
Template specialization with enable_if
我正在尝试创建一个采用类型名的模板函数。我想将此模板专门用于一些基本类型,例如 int
、long
、string
和 double
。对于所有其他类型,我需要 class/struct 的专用代码和其他类型的默认代码。
我目前的代码是这个:
// Declaration
template <typename T, typename enable_if<is_class<T>::value>::type = 0>
void test(T& value);
template <typename T, typename enable_if<!is_class<T>::value>::type = 0>
void test(T& value);
template <> // What am i supposed to write here ?
void test<int>(int& value);
// Definition
template <typename T, typename enable_if<is_class<T>::value>::type = 0>
void test(T& value) {
cout << "Class/struct test" << endl;
}
template <typename T, typename enable_if<!is_class<T>::value>::type = 0>
void test(T& value) {
cout << "Other types test" << endl;
}
template <>
void test<int>(int& value) {
cout << "int test" << endl;
}
此代码无法编译。我不知道我应该在 int
专用模板中写什么。
我正在尝试使用 the examples from this documentation,但我无法使其正常工作。
您需要在函数参数中使用 std::enable_if 而不是模板参数:
// Declaration
template <typename T>
void test(T& value, enable_if_t<is_class<T>::value>* = nullptr);
template <typename T>
void test(T& value, enable_if_t<!is_class<T>::value>* = nullptr);
template <>
void test<int>(int& value, enable_if_t<!is_class<int>::value>*);
// Definition
template <typename T>
void test(T& value, enable_if_t<is_class<T>::value>*){
cout << "Class/struct test" << endl;
}
template <typename T>
void test(T& value, enable_if_t<!is_class<T>::value>*) {
cout << "Other types test" << endl;
}
template <>
void test<int>(int& value, enable_if_t<!is_class<int>::value>*) {
cout << "int test" << endl;
}
typename enable_if<is_class<T>::value>::type = 0
没有意义,因为 typename enable_if<is_class<T>::value>::type
会引用 void
;您可以将其更改为 typename enable_if<is_class<T>::value>::type* = nullptr
。然后对于 int
的完全特化,请注意 test
有两个模板参数,然后
// Declaration
template <typename T, typename enable_if<is_class<T>::value>::type* = nullptr>
void test(T& value);
template <typename T, typename enable_if<!is_class<T>::value>::type* = nullptr>
void test(T& value);
template <>
void test<int, nullptr>(int& value);
// Definition
template <typename T, typename enable_if<is_class<T>::value>::type*>
void test(T& value) {
cout << "Class/struct test" << endl;
}
template <typename T, typename enable_if<!is_class<T>::value>::type*>
void test(T& value) {
cout << "Other types test" << endl;
}
template <>
void test<int, nullptr>(int& value) {
cout << "int test" << endl;
}
或者干脆把typename enable_if<is_class<T>::value>::type
作为return类型。例如
// Declaration
template <typename T>
typename enable_if<is_class<T>::value>::type test(T& value);
template <typename T>
typename enable_if<!is_class<T>::value>::type test(T& value);
template <>
void test<int>(int& value);
// Definition
template <typename T>
typename enable_if<is_class<T>::value>::type test(T& value) {
cout << "Class/struct test" << endl;
}
template <typename T>
typename enable_if<!is_class<T>::value>::type test(T& value) {
cout << "Other types test" << endl;
}
template <>
void test<int>(int& value) {
cout << "int test" << endl;
}
我正在尝试创建一个采用类型名的模板函数。我想将此模板专门用于一些基本类型,例如 int
、long
、string
和 double
。对于所有其他类型,我需要 class/struct 的专用代码和其他类型的默认代码。
我目前的代码是这个:
// Declaration
template <typename T, typename enable_if<is_class<T>::value>::type = 0>
void test(T& value);
template <typename T, typename enable_if<!is_class<T>::value>::type = 0>
void test(T& value);
template <> // What am i supposed to write here ?
void test<int>(int& value);
// Definition
template <typename T, typename enable_if<is_class<T>::value>::type = 0>
void test(T& value) {
cout << "Class/struct test" << endl;
}
template <typename T, typename enable_if<!is_class<T>::value>::type = 0>
void test(T& value) {
cout << "Other types test" << endl;
}
template <>
void test<int>(int& value) {
cout << "int test" << endl;
}
此代码无法编译。我不知道我应该在 int
专用模板中写什么。
我正在尝试使用 the examples from this documentation,但我无法使其正常工作。
您需要在函数参数中使用 std::enable_if 而不是模板参数:
// Declaration
template <typename T>
void test(T& value, enable_if_t<is_class<T>::value>* = nullptr);
template <typename T>
void test(T& value, enable_if_t<!is_class<T>::value>* = nullptr);
template <>
void test<int>(int& value, enable_if_t<!is_class<int>::value>*);
// Definition
template <typename T>
void test(T& value, enable_if_t<is_class<T>::value>*){
cout << "Class/struct test" << endl;
}
template <typename T>
void test(T& value, enable_if_t<!is_class<T>::value>*) {
cout << "Other types test" << endl;
}
template <>
void test<int>(int& value, enable_if_t<!is_class<int>::value>*) {
cout << "int test" << endl;
}
typename enable_if<is_class<T>::value>::type = 0
没有意义,因为 typename enable_if<is_class<T>::value>::type
会引用 void
;您可以将其更改为 typename enable_if<is_class<T>::value>::type* = nullptr
。然后对于 int
的完全特化,请注意 test
有两个模板参数,然后
// Declaration
template <typename T, typename enable_if<is_class<T>::value>::type* = nullptr>
void test(T& value);
template <typename T, typename enable_if<!is_class<T>::value>::type* = nullptr>
void test(T& value);
template <>
void test<int, nullptr>(int& value);
// Definition
template <typename T, typename enable_if<is_class<T>::value>::type*>
void test(T& value) {
cout << "Class/struct test" << endl;
}
template <typename T, typename enable_if<!is_class<T>::value>::type*>
void test(T& value) {
cout << "Other types test" << endl;
}
template <>
void test<int, nullptr>(int& value) {
cout << "int test" << endl;
}
或者干脆把typename enable_if<is_class<T>::value>::type
作为return类型。例如
// Declaration
template <typename T>
typename enable_if<is_class<T>::value>::type test(T& value);
template <typename T>
typename enable_if<!is_class<T>::value>::type test(T& value);
template <>
void test<int>(int& value);
// Definition
template <typename T>
typename enable_if<is_class<T>::value>::type test(T& value) {
cout << "Class/struct test" << endl;
}
template <typename T>
typename enable_if<!is_class<T>::value>::type test(T& value) {
cout << "Other types test" << endl;
}
template <>
void test<int>(int& value) {
cout << "int test" << endl;
}