как запросить если (T == интервал) с шаблонным классом

-z (что-то) означает, что (что-то) равно NULL, тогда верните true

http://unixhelp.ed.ac.uk/CGI/man-cgi?test

предполагает, что нулевая длина также возвращает true, я бы посоветовал выполнить «man test» на вашей машине, чтобы проверить точную формулировку в вашей системе.

23
задан Meir 14 June 2009 в 08:55
поделиться

7 ответов

Примерно так:

template< class T >
struct TypeIsInt
{
    static const bool value = false;
};

template<>
struct TypeIsInt< int >
{
    static const bool value = true;
};

template <typename T>
ostream& operator << (ostream &out,Vector<T>& vec)
{
    if (TypeIsInt< T >::value)
    // ...
}
41
ответ дан 29 November 2019 в 00:40
поделиться

Определите его явно, например:

template <>
ostream& operator << (ostream &out,Vector<int>& vec)
{
}
10
ответ дан 29 November 2019 в 00:40
поделиться

Простейшее и наиболее общее решение: Просто напишите простую старую перегрузку функции:

ostream& operator << (ostream &out,Vector<int>& vec)
{
// Your int-specific implementation goes here
}

Предполагается, что версии int и не int не имеют большого общего кода, так как вам нужно написать два отдельные реализации.

ЕСЛИ вы хотите использовать одну общую реализацию функции, только с оператором if внутри, который отличается, используйте реализацию Чарльза Бейли:

template< class T >
struct TypeIsInt
{
    static const bool value = false;
};

template<>
struct TypeIsInt< int >
{
    static const bool value = true;
};

template <typename T>
ostream& operator << (ostream &out,Vector<T>& vec)
{
    if (TypeIsInt< T >::value) {
      // your int-specific code here
    }
}

В общем, не используйте typeid , если вам это не нужно.

10
ответ дан 29 November 2019 в 00:40
поделиться

Самый простой способ - указать специализацию шаблона:

#include <iostream>
#include <vector>
using namespace std;

template <typename T> struct A {
};

template <typename T > 
ostream & operator <<( ostream & os, A<T> & a  ) {
    return os << "not an int" << endl;
}


template <> 
ostream & operator <<( ostream & os, A<int> & a  ) {
    return os << "an int" << endl;
}

int main() {
    A <double> ad;
    cout << ad;
    A <int> ai;
    cout << ai;
}
9
ответ дан 29 November 2019 в 00:40
поделиться

Таким образом.

ostream & operator << (ostream &out, Vector<int> const & vec)
{
    // ...
}

Компилятор выберет эту функцию вместо шаблона функции, если вы передадите Vector .

Изменить: я нашел эта статья , в которой делается попытка объяснить, почему следует предпочесть перегрузку специализации шаблона.

8
ответ дан 29 November 2019 в 00:40
поделиться

TypeID никогда не подходит идея. Он полагается на RTTI. Кстати, вот ваш ответ: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.7

6
ответ дан 29 November 2019 в 00:40
поделиться

Шаблоны C ++ так не работают. Общая идея шаблонов - это выразить что-то, что характерно для множества разных типов. И в вашем случае вы должны использовать специализацию шаблона.

template<class T> ostream& operator<< (ostream& out, const vector<T>& v)
{
    // your general code for all type
}
// specialized template
template<> ostream& operator<< <int>(ostream& out, const vector<int>& vec)
{
    // your specific to iny type code goes here
}

Тогда компилятор C ++ вызовет эту функцию, когда вы используете тип int и общую реализацию для любого другого типа

std::vector<int> f(5, 5);
std::cout << f;
0
ответ дан 29 November 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: