Я пытаюсь написать класс с перегруженными конструкторами, которые принимают объекты std:: function в качестве параметров, но, конечно, каждая чертова вещь может быть неявно передана в std:: функцию любой подписи. Что действительно полезно, естественно.
Пример:
class Foo {
Foo( std::function<void()> fn ) {
...code...
}
Foo( std::function<int()> fn ) {
...code...
}
};
Foo a( []() -> void { return; } ); // Calls first constructor
Foo b( []() -> int { return 1; } ); // Calls second constructor
Это не будет компилироваться, жалуясь, что оба конструктора по существу идентичны и неоднозначны. Это, конечно, нонсенс. Я пробовал enable_if, is_same и множество других вещей. Признание указателей функций не может быть и речи, потому что это предотвратит прохождение состояния lambdas. Неужели должен быть способ достичь этого?
Мои шаблонные навыки немного не хватает, я боюсь. Обычные шаблонные классы и функции достаточно просты, но играть глупых педерастов с компилятором немного из моей лиги. Может кто-нибудь помочь мне, пожалуйста?
Я знаю, что варианты этого вопроса заданы раньше, но они в основном сосредоточены на нормальных функциях, а не на конструкторах; или перегрузка аргументами вместо возвращаемых типов.