Представьте себе класс (в VS2010, не VARIADIC шаблоны здесь извините)Условная компиляция перегруженных функций в шаблонных классов
template <class Arg>
class FunctionWrapper
{
public:
void Invoke(Arg arg){_fn(arg)};
private:
std::function<void(Arg)> _fn;
}
я не могу сделать то, например,
FunctionWrapper <int> foo; foo.Invoke(4);
И это компилируется в порядке. Но это не так:
FunctionWrapper <void> foo; foo.Invoke();
Теперь я мог бы обойти это, используя специализированную специализацию. Но я также задавался вопросом, есть ли способ, которым я мог бы обойти это еще один способ ....
template <class Arg>
class FunctionWrapper
{
public:
void Invoke(void){_fn()}; // } overloaded
void Invoke(Arg arg){_fn(arg)}; // }
private:
std::function<void(Arg)> _fn;
}
т.е. перегрузки Invoke, а затем ответить на условной компиляции, так что если я создаю экземпляр FunctionWrapper<void>
, версии Invoke с аргументом никогда не компилируется. Я уверен, что я читал, как это сделать в Modern C++, но я не могу запомнить подробности .....
Я думал, что это идеальный сценарий для использования специализации. Даже если то, что вы спросите, может быть сделано, какая польза? –
A. Мне интересно, как это сделать, поскольку я думаю, что это возможно, и мне нравится знать. B. Это избавит меня от определения второго, в основном идентичного определения класса для специализации void. –