Вы можете выполнять проверки во время выполнения или во время компиляции, но не одновременно.
Если у вас есть проверки во время компиляции, вы вынуждены каким-то образом жестко кодировать значения. Это домен constexpr и static_assert. Это несколько ваше первое решение.
Если вы хотите передать значение в конструктор, вы теряете проверку времени компиляции, поскольку теперь вы присваиваете значения, а компилятор не знает, какое значение может быть передано в конструктор. Вы можете использовать такие вещи, как bounded :: integer или свернуть свои собственные, которые проверяют значение во время выполнения и ведут себя соответственно. (например, runtime_error)
Вопрос, который вы должны задать себе, что является неизменным свойством кода. Если он неизменен (для этого варианта использования), вы должны использовать аргументы шаблона. Если он неизменен для этого экземпляра, но может варьироваться в зависимости от варианта использования, вам следует использовать постоянную переменную-член.
Попытайтесь установить значение тайм-аута в своем прокси-классе веб-сервиса:
WebReference.ProxyClass myProxy = new WebReference.ProxyClass();
myProxy.Timeout = 100000; //in milliseconds, e.g. 100 seconds