使用enable_if进行模板专业化

Mag*_*gus 3 c++ templates template-specialization enable-if c++11

我正在尝试创建一个使用类型名的模板函数。我想这个专门的模板,一些基本的类型,如int,long,string和double。对于所有其他类型,我需要为类/结构使用专门的代码,并为其他类型使用默认代码。

我当前的代码是这个:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

该代码将无法编译。我不知道我应该在int专业模板中写些什么。

我正在尝试使用本文档中的示例,但无法使其正常工作。

son*_*yao 5

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;
}
Run Code Online (Sandbox Code Playgroud)

生活

或者简单地将其typename enable_if<is_class<T>::value>::type作为返回类型。例如

// 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;
}
Run Code Online (Sandbox Code Playgroud)

生活