Я нашел похожие случаи, но они обычно делали что-то вроде того, что я (думаю) я здесь делаю.Устранение неоднозначности перегрузки с помощью SFINAE
Я хочу, чтобы иметь возможность вызывать функцию с одним или несколькими параметрами, очевидно, если функция существует с перегрузками с несколькими параметрами, правильная версия не может быть выведена без помощи.
Как я также указываю количество аргументов, я понял, что для компилятора достаточно информации, чтобы вывести правильную перегрузку. Это, похоже, не так, и я надеюсь, что вы сможете показать мне, почему.
код: http://coliru.stacked-crooked.com/a/5e6fd8d5418eee3c
#include <iostream>
#include <type_traits>
#include <functional>
template < typename R, typename... A, typename... Args >
typename std::enable_if< sizeof...(A) == sizeof...(Args), R >::type
call_my_function(R(*func)(A...), Args ...a)
{
return func(a...);
}
int arg_count() { return 0; }
int arg_count(int) { return 1; }
int arg_count(int,int) { return 2; }
int main()
{
std::cout << call_my_function(arg_count, 0) << std::endl;
return 0;
}
Короче говоря, я пытался иметь все функции, которые имеют различное количество аргументов, чем число аргументов я поставляемые, не в состоянии с помощью SFINAE. Но, похоже, их все равно считают, и двусмысленность остается.
Имя 'args_count' само по себе является неоднозначным, поскольку нет никакой информации о том, какую перегрузку он мог бы ссылаться. Вы можете использовать бросок или заставить свои функции выполнять правильную перегрузку функции, но это не может произойти в общем случае. – 0x499602D2