2016-08-21 6 views
-2

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

void bar(int a = 4, char b = 'A') 
{ 
} 

По this resource это можно назвать как:

bar(b : 'Z'); 

но это дает me identifier "b" is undefined. Я использую Visual Studio 2015 Update 3 Enterprise.

Любые предложения, как указать только второй параметр?

+5

Это предложение –

+0

Кстати, это предложение, вероятно, никогда не будет реализовано (насколько я могу судить), потому что оно сталкивается с техническими особенностями того, как вызывается функции C++, и предлагает предлагать библиотеки ссылок, несовместимые с чем-либо, что отсутствует там. –

+0

ОК, будет закрыт – mihkov

ответ

7

Документ, на который вы ссылаетесь, является всего лишь предложением¹. Механизм, который вы пытаетесь использовать, (в настоящее время) не является частью C++, как определено в стандартах. Таким образом, вы не можете ожидать от компиляторов его реализации.

В настоящее время нет других стандартных обходных решений. Если вы хотите установить какой-либо параметр, вам также необходимо предоставить все параметры, которые предшествуют ему в объявлении функции.

Вы можете использовать что-то вроде Boost Parameter или реализовать что-то подобное себе, чтобы эмулировать функцию с помощью кода пользователя. Независимо от того, является ли это хорошей идеей, стоит обсуждать, это не слишком распространено и, таким образом, может смущать других программистов.


¹This может быть проблемой языка: «Предложение» является то, что кто-то говорит, что было бы хорошо, а не государственные вещи.

0

Одним из возможных решений может быть использование std::bind с заполнителями, определенными в этом пространстве имен. Например:

void bar(int a = 4, char b = 'A') { 
} 

using namespace std::placeholders; 
auto f = std::bind(bar, 2, _2); 
f('Z'); // equivalent to bar(2, 'Z'); 

Как предложено в другом ответе, нет никакого способа, чтобы иметь выражение std::bind использовать аргумент по умолчанию из объявления функции, но по крайней мере, позволяет указать только один из аргументов к нему.