2013-12-13 2 views
0

Если у меня есть:Как отключить шаблон, если параметр шаблона не указан?

template< typename T > 
foo(T bar) 
{ 
    // do stuff. 
} 

Как я могу отключить шаблон от использования, если кто-то пишет

int bar; 
foo(bar)? 

Позвольте мне объяснить немного дальше:

template< typename T, typename Y > inline void 
destroy(T &t, Y &y) 
{ 
} 

template< typename T, typename Y > inline void 
destroy(T &t, Y &&y) 
{ 
} 

template< typename T > inline void 
destroy(T &t, unsigned long int &y) 
{ 
} 

Если я печатаю

destroy< unsigned long int >(something, 10) 

Это вызывает

template< typename T, typename Y > inline void 
    destroy(T &t, Y &&y) 
+3

Что вы имеете в виду «отключить»? Как не использовать синтаксис угловой скобки? Это тип-вычет и работает отлично. Компилятор будет интерпретировать 'foo (100)' то же, что и 'foo (100)'. –

+1

Вы хотите заставить людей явно сказать foo (bar) вместо того, чтобы подразумевать этот параметр? – falstro

+0

@WilliamCustode Следует отметить, что это верно только для * функций *, если foo является конструктором для шаблона класса foo', то ваш SOL. – IdeaHat

ответ

5

Параметр шаблона может быть выведен из параметров функции, поэтому его не нужно явно указывать.

Вы можете избежать этого, сделав вывод неудачу:

template<typename T> 
struct wrap { typedef T type; }; 

template<typename T> 
void foo(typename wrap<T>::type bar); 

void test() 
{ 
     foo(3);   // fails 
     foo<int>(3); // works 
} 
+0

Почему я не подумал об этом? Умный, но довольно бессмысленный imo (но это на OP). – chris

+0

Примечание: это играет на * не выводимых контекстах * для тех, кто интересуется копанием :) –

+0

Я отмечу это как ответный ответ. Хотя, это не совсем то, что я хотел видеть. Я ненавижу, что он решает использовать шаблон, который ожидает 2 аргумента шаблона, когда предоставляется только 1, и шаблон, который ожидает, что 1 шаблонный аргумент свободен, будет выбран, но это не так. – user985611

0

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

Что вы можете сделать, это предоставить специализации для типов, которые вы делаете do хотите создать экземпляр шаблона и не предоставлять реализацию для неспециализированной версии.

template< typename T > 
foo(T bar); 

template<> foo <int> (int bar) 
{ 
    // do stuff. 
} 

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

Смежные вопросы