Есть ли способ иметь динамические аргументы по умолчанию?

#parameters #d #member-functions #member-variables #default-arguments

#параметры #d #функции-члены #переменные-члены #аргументы по умолчанию

Вопрос:

Я пытаюсь создать класс, в котором пользователь может изменять переменные-члены, чтобы изменять аргументы по умолчанию своих функций-членов.

 class Class
{
    public int Member;

    public void Method(int Argument = Member)
    {
        // This compiles fine, until I try to actually use
        // the method elsewhere in code!

        // "Error: need 'this' to access member Member"
    }
}
  

До сих пор моим обходным путем было использование магических чисел, что, очевидно, не идеально.

 public void Method(int Argument = 123)
{
    int RealArgument;

    if (Argument == 123) RealArgument = Member;
    else RealArgument = Argument;
}
  

Есть ли лучший способ, или я застрял с этим «хакерским» решением?

Ответ №1:

Да, забудьте об аргументе по умолчанию.

 class Class
{
    public int Member;

    public void Method(int Argument)
    {
        ...
    }

    public void Method()
    {
        Method(Member);
    }
}
  

Здесь не нужно хитрить.

Комментарии:

1. Это может быть непрактично для многих аргументов, но mixins могут помочь сгенерировать код автоматически.

2. Использование шаблонов переменных и тщательное присвоение имен может позволить вам получить этот эффект только с базовой функцией и одним шаблоном-оболочкой.