Я использую операторы enable_if для удаления возможных методов.Как enable_if используется для удаления кода
#include "gmpxx.h"
#include <iostream>
template <typename T>
struct is_ring_field {
};
template <>
struct is_ring_field<int> {
static const bool value = false;
};
template <>
struct is_ring_field<mpq_class> {
static const bool value = true;
};
template<typename T>
std::enable_if<is_ring_field<T>::value,int> RankMat(T const& Input)
{
return 10;
}
template<typename T>
std::enable_if<(not is_ring_field<T>::value),int> RankMat(T const& Input)
{
return 20;
}
int main()
{
int M1=10;
mpq_class M2=3;
std::cerr << "FICT rank(M1)=" << RankMat(M1) << "\n";
std::cerr << "FICT rank(M2)=" << RankMat(M2) << "\n";
}
Конечная цель - иметь методы, которые варьируются в зависимости от типа алгебраических данных на входе. По другим признакам это работало для меня, но не для этого. В этом случае компилятор странно говорит, что вызов неоднозначен, другими словами, не удалось выполнить std :: enable_if.
Посмотрите на двух перегрузках для 'RankMat'. Какая часть перегрузок отличается? Может ли эта часть быть единственной частью функции, которая отличается допустимой перегрузкой? – NathanOliver
Не забыли ли вы 'typename std :: enable_if <*,*> :: type'? –
Да, я узнал после того, как написал свое сообщение, извините. Оба сообщения из clang ++ и g ++ были бесполезны. –