使用enable_if进行模板专业化

问题描述 投票:3回答:2

我正在尝试使用typename创建模板函数。我想将这些模板专门用于一些基本类型,如intlongstringdouble。对于所有其他类型,我需要一个专门的类/结构代码,以及其他类型的默认代码。

我目前的代码就是这个:

// 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;
}

此代码将无法编译。我无法想象我应该在qazxsw poi专业模板中写些什么。

我正在尝试使用int,但我无法使其正常工作。

c++ c++11 templates template-specialization enable-if
2个回答
5
投票

the examples from this documentation没有意义,因为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; }

或者简单地将LIVE作为返回类型。例如

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; }


0
投票

您需要在函数参数中使用std :: enable_if而不是模板参数:

LIVE

推荐问答