и все, в VC ++ мне нужно переопределить родительские типы самим собой, и я не могу использовать что-либо из родительского класса при определении дочернего типа. К счастью, это не проблема разрушения дизайна, но немного раздражает. Спасибо за код.

вопрос объединяет несколько фрагментов кода и немного сложен, но я постарался максимально уменьшить его.

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

Это попытка развить следующий вопрос:Вот, но достаточно отличается и фокусируется наstd::enable_if заслуживать другого вопроса. Я также предоставляюЖивой пример это работает с проблемными частями, закомментированными.

Для проверки типов аргумента (и результата) функтора у меня есть следующий класс:

template <typename T>
struct function_traits
    : public function_traits<decltype(&T::operator())>
{};
// For generic types, directly use the result of the signature of its 'operator()'

template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const>
    // we specialize for pointers to member function
{
    enum { num_args = sizeof...(Args) };

    typedef ReturnType result_type;

    template <size_t N>
    struct arg
    {
        typedef typename std::tuple_element<N, std::tuple<Args...>>::type type;
        // the i-th argument is equivalent to the i-th tuple element of a tuple
        // composed of those arguments.
    };
};

Затем я пытаюсь запустить приведенный ниже код, однакоstd::enable_if кажется, что часть не работает, но я знаю, что все, что в скобках, работает (или должно) работать, как продемонстрированоЖивой пример.

template<typename data_type, typename Type1, typename Type2>
class A
{
public:
    using a_type = std::tuple<Type1, Type2>;
    using b_type = std::tuple<std::size_t,std::size_t>;

    template<typename Lambda, typename = std::enable_if_t<std::is_same<typename function_traits<Lambda>::arg<0>::type, b_type>::value>>
    A(const Lambda& Initializer)
    {
        std::cout << "idx_type" << std::endl;
    }
    template<typename Lambda, typename = std::enable_if_t<std::is_same<typename function_traits<Lambda>::arg<0>::type, a_type>::value>>
    A(const Lambda& Initializer)
    {
        std::cout << "point_type" << std::endl;
    }
};

int main()
{
    auto f = [](std::tuple<long long, int>) -> double { return 2; };

    std::cout << std::is_same<typename function_traits<decltype(f)>::arg<0>::type, std::tuple<std::size_t, std::size_t>>::value
        << std::is_same<typename function_traits<decltype(f)>::arg<0>::type, std::tuple<long long, int>>::value;

    auto a = A<double, long long, int>{
        [](std::tuple<long long, int>) -> double { return 1; }
    };

    auto b = A<double, long long, int>{
        [](std::tuple<std::size_t, std::size_t>) -> double { return 2; }  
    };

}

Так чего мне не хватает? Я работаю над примером № 5Вот.

Ответы на вопрос(1)

Ваш ответ на вопрос