Проблема понимания этого использования шаблона для функции - PullRequest
0 голосов
/ 09 декабря 2010

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

template<char *name, int iteration, bool high>
void test( short step )
{
   if(high)
     iteration++;
   change(name,iteration);
}

template void test<"John", 5, true>( short );

РЕДАКТИРОВАТЬ: if (bool) явно была ошибка, заменили ее на правильную вещь.

Ответы [ 3 ]

2 голосов
/ 09 декабря 2010

Нет никакого ада, что этот код скомпилируется. Во-первых, вы не можете передавать строковые литералы через шаблон. Во-вторых, if (bool)?

Причина, по которой вы этого не понимаете, в том, что это бессмысленная чепуха.

2 голосов
/ 09 декабря 2010

Ничего не происходит.Шаблон просто объявляется, а затем явно создается.Это не вызывается.

На самом деле, я сомневаюсь, что он компилируется.Я не думаю, что if (bool) является допустимым выражением.

Другая причина, по которой он не компилируется, состоит в том, что строковый литерал не может быть параметром шаблона.Я действительно хотел бы, чтобы это могло быть, потому что это было бы весьма полезно во многих конструкциях метапрограммирования, которые я использовал.Для того, чтобы передать char * в шаблон, вы должны сделать это:

extern char * param = "whatever";
expects_char_param<param>();

И даже если эта функция ДЕЙСТВУЛА и скомпилирована, и bool был заменен на high в теле,это был бы невероятно глупый способ сделать это.Чтобы понять, ЧТО это делает, просто представьте, что параметры являются переменными, какими они должны быть, и пройдитесь по коду.Если вы все еще не понимаете ... не знаю, что вам сказать.

1 голос
/ 09 декабря 2010

Этот шаблон полностью сломан. Во-первых, как уже упоминал Ноа Робертс, if(bool) даже не скомпилируется. С другой стороны, iteration является параметром шаблона, то есть он должен быть константой времени компиляции, поэтому iteration++; также не будет компилироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...