В чем практическая разница между "встроенными" и "шаблонными <class= void>"?
У нас есть 2 метода для объявления функции в библиотеке только для заголовка. Они inline
и template<class= void>
. В boost
исходнике я вижу оба варианта. Пример следует:
inline void my_header_only_function(void)
{
// Do something...
return;
}
template<class = void> void my_header_only_function(void)
{
// Do something...
return;
}
Я знаю разницу в соответствии со стандартом C++. Тем не менее, любой C++ компилятор намного больше, чем просто стандартный, а также стандартный, часто неясный.
В ситуации, когда аргумент шаблона никогда не используется и где он не связан с рекурсивным вариационным шаблоном, есть (и какова) практическая разница между двумя вариантами для основных компиляторов?
Ответы
Ответ 1
Я думаю, что это можно использовать как странный способ разрешить расширение библиотеки (или насмешку) извне кода библиотеки, предоставляя специализацию для void
или не шаблонной версии функции в том же пространстве имен:
#include <iostream>
template<class = void>
int
foo(int data)
{
::std::cout << "template" << std::endl;
return data;
}
// somewhere else
int
foo(int data)
{
::std::cout << "non-template" << std::endl;
return data;
}
int main()
{
foo(1); // non template overload is selected
return 0;
}
онлайн компилятор
Ответ 2
Одно из отличий состоит в том, что двоичный код функции может стать частью сгенерированного объектного файла, даже если функция никогда не используется в этом файле, но никогда не будет никакого кода для шаблона, если он не используется.
Ответ 3
Я автор Зверя. Надеюсь, я смогу пролить свет на то, почему вы видите одно против другого. Это на самом деле очень просто, кажется, что шаблон, скорее всего, не будет встроен в вызывающие функции, без необходимости раздувая код. Я знаю, что "inline" на самом деле должен означать "удалить дубликаты определений", но иногда разработчики компиляторов становятся слишком усердными. С шаблоном все немного сложнее (Трэвис иногда выдает только 2 ГБ ОЗУ). Поэтому я решил попробовать написать что-то новое, используя ключевое слово "inline". Я до сих пор не знаю, что я чувствую по этому поводу.
Короткий ответ: я делал это одним способом в течение долгого времени, а затем я кратко сделал это другим способом без особой веской причины. Извините, если это не так интересно, как другие теории! (которые были очень интересны на самом деле)