Имам проблеми с опитите си да разбера как да посоча аргументи по подразбиране за препращаща препратка (по-рано наричана Универсални препратки от Скот Майерс).
Ето пример за код, който се опитва да направи това, което искам да направя:
struct encoder_t {
} const encoder = {};
struct validator_t {
} const validator = {};
struct test {
template <typename Range, typename Encoding, typename Validation>
test ( Range&& range, Encoding&& encoding = encoder, Validation&& validation = validator ) {
}
};
int main() {
test( "woof" );
}
Също така се предлага в Coliru.
Преглеждайки грешките, откривате, че можете да го накарате да работи, като зададете по подразбиране аргумента на шаблона и след това конструирате аргумента по подразбиране след това:
// Works! But the syntax is strange... potential ramifications/deduction mishaps?
// Is this the "proper" way to default these arguments?
template <typename Range, typename Encoding = encoder_t, typename Validation = validator_t>
test ( Range&& range, Encoding&& encoding = Encoding(), Validation&& validation = Validation() ) {
}
Това ли е "правилният" начин за справяне с това? Какъв трябва да бъде синтаксисът, който използвам? Има ли няколко начина за постигане на желания ефект от „препратени препратки по подразбиране“? По какъв начин трябва да пиша това? Също така имайте предвид, че по-късно ще поръся тонове SFINAE върху кода, така че бих предпочел много повече нещо, което не включва писане на множество претоварвания.