C++ частичная специализация метода

Используйте команду даты, чтобы преобразовать эти два раза в стандартный формат и вычесть их. Вы, вероятно, захотите сохранить предыдущее время выполнения в dotfile, тогда делают что-то как:

last = cat /tmp/.lastrun
curr = date '+%s'

diff = $(($curr - $last))
if [ $diff -gt 3600 ]; then
    # ...
fi

echo "$curr" >/tmp/.lastrun

(Спасибо, Steve.)

11
задан faya 8 October 2009 в 05:45
поделиться

5 ответов

Если у вас уже есть специализированный класс, вы можете указать другой реализация foo в специализированном классе:

template<typename A, typename B>
class C
{
public:
    void foo() { cout << "default" << endl; };
};

template<typename A>
class C<A, CObject>
{
public:
  void foo() { cout << "CObject" << endl; };
};

Чтобы специализировать функцию-член в Visual C ++ 2008, вы также можете сделать ее шаблоном:

template<typename A, typename B>
class C
{
  template<typename T>
  void foo();

  template<>
  void foo<CObject>();
};

Похоже, что вышеприведенное решение будет доступно только в будущем стандарте C ++ (согласно черновик n2914 14.6.5.3/2).

12
ответ дан 3 December 2019 в 04:52
поделиться

Я думаю, здесь есть недоразумение.

Есть два вида шаблонов:

  • классы шаблонов
  • методы шаблонов

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

template <class A>
class C<A,CObject>
{
  void foo() { ... } // specialized code
};

Проблема в вашем примере относительно проста: вы определяете метод foo для специализации C, но эта специализация никогда не объявлялась заранее.

Проблема здесь в том, что вам нужно полностью специализировать свой класс C (и, таким образом, копировать большой объем данных). Существует ряд обходных путей.

  • Наследование (состав?): Выполните всю обычную работу в базовом классе, затем сделайте так, чтобы класс C наследовал и специализировался соответствующим образом
  • Друг: вместо использования 'foo'
8
ответ дан 3 December 2019 в 04:52
поделиться

Поскольку класс является шаблоном, вам нужно его специализовать:

template <class A>
class C<A, CObject> 
{
   void foo() { ... }
}
1
ответ дан 3 December 2019 в 04:52
поделиться

Если я правильно помню, вы не можете сделать частичную специализацию шаблона для функций. Не уверен, включен ли он в C ++ 0X

Обновление: (Ожидает подтверждения) Как отмечено в комментариях, частичная специализация функций шаблонов возможна в C ++ 0X.

0
ответ дан 3 December 2019 в 04:52
поделиться

Нет, частичная специализация шаблона функции в C ++ 0x не добавляется.

Как правильно упомянуто выше, в отношении шаблонов функций в основном было сделано 2 вещи:

  • стали доступными аргументы шаблонов по умолчанию;
  • были введены вариативные шаблоны.

Итак, как и раньше, следует использовать обходные пути для "имитации" частичной специализации шаблонов функций.

2
ответ дан 3 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

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