Por que argumentos de modelo padrão são permitidos apenas em modelos de classe? Por que não podemos definir um tipo padrão em um modelo de função de membro? Por exemplo:
struct mycclass {
template<class T=int>
void mymember(T* vec) {
// ...
}
};
Em vez disso, o C ++ força que os argumentos padrão do modelo sejam permitidos apenas em um modelo de classe.
struct S { template <class R = int> R get_me_R() { return R(); } };
O parâmetro do modelo não pode ser deduzido do contexto.template <int N = 1> int &increment(int &i) { i += N; return i; }
e depoisincrement(i);
ouincrement<2>(i);
. Como é, eu tenho que escreverincrement<1>(i);
.Respostas:
Faz sentido fornecer argumentos de modelo padrão. Por exemplo, você pode criar uma função de classificação:
O C ++ 0x os apresenta ao C ++. Veja este relatório de defeitos de Bjarne Stroustrup: Argumentos de modelo padrão para modelos de função e o que ele diz
fonte
double
no meu caso). Talvez não seja "geral", mas há alguma desvantagem nessa prática? Obrigado.error: invalid conversion from ‘int’ to ‘int*’
, qualquer idéia do porquê: `#include <array> #include <algorithm> #include <functional> template <typename Iterator, typename Comp = std :: less <Iterator>> void my_sort ( Iterator beg, Iterator end, Comp c = Comp ()) {std :: sort (beg, end, c); } int main () {std :: array <int, 5> ar {5,2,21,7,4}; minha_sort (ar.begin (), ar.end ()); } `Para citar os modelos C ++: O guia completo (página 207):
fonte
Até o momento, todos os exemplos apresentados de parâmetros de modelo padrão para modelos de função podem ser feitos com sobrecargas.
AraK:
poderia ser:
Meu próprio:
poderia ser:
litb:
poderia ser:
Stroustrup:
Poderia ser:
O que eu provei com o seguinte código:
A saída impressa corresponde aos comentários de cada chamada para f e a chamada comentada falha ao compilar conforme o esperado.
Portanto, suspeito que os parâmetros padrão do modelo "não são necessários", mas provavelmente apenas no mesmo sentido em que argumentos de função padrão "não são necessários". Como o relatório de defeitos da Stroustrup indica, a adição de parâmetros não deduzidos era tarde demais para alguém perceber e / ou realmente apreciar que isso tornava os padrões úteis. Portanto, a situação atual é baseada em uma versão dos modelos de função que nunca foi padrão.
fonte
template<typename T = void> int SomeFunction();
. O parâmetro do modelo aqui nunca é usado e, de fato, a função nunca é chamada; o único local a que se refere é umdecltype
ousizeof
. O nome corresponde deliberadamente ao nome de outra função, mas o fato de ser um modelo significa que o compilador preferirá a função livre, se existir. Os dois são usados no SFINAE para fornecer comportamento padrão onde uma definição de função está ausente.No Windows, com todas as versões do Visual Studio, você pode converter esse erro ( C4519 ) em um aviso ou desabilitá-lo da seguinte forma:
Veja mais detalhes aqui .
fonte
O que eu uso é o próximo truque:
Vamos dizer que você deseja ter uma função como esta:
Você não será permitido, mas eu faço da próxima maneira:
Portanto, você pode usá-lo desta maneira:
Como podemos ver, não é necessário definir explicitamente o segundo parâmetro. Talvez seja útil para alguém.
fonte