Полностью избежать замены параметров шаблонаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Полностью избежать замены параметров шаблона

Сообщение Anonymous »

У меня есть класс, который может принимать арифметические типы и std :: complex . Упрощенный код класса-< /p>

Код: Выделить всё

#include 

template struct is_complex : std::false_type {};
template struct is_complex : std::true_type {};

template
struct Foo {
void foo(typename T::value_type t)
requires (is_complex::value) {
}
};

Теперь я хотел бы взять внутренний тип std :: complex и использовать его в качестве типа параметров в функции foo . Например, пример , если t IS std :: complex , я хочу, чтобы типы параметров были двойными .
Эта функция должна быть доступна только Когда t действительно std :: complex .
Я думал, что могу использовать Typename t :: value_type в качестве типа параметра, так как STD: : Комплекс имеет typedef value_type . Кроме того, я думал, что использование требуется здесь, чтобы позволить T, чтобы заменить в этой функции в случае, если t не был STD :: Complex. Глупый я.

Проблема в том, что всякий раз, когда я создаю foo код ломается, поскольку фундаментальные данные не имеют :: value_type .

Код: Выделить всё

int main() {
Foo obj; // Breaks the code.
//obj.foo(4); // Function shouldn't be considered in overload resolution ideally...

Foo obj2; // Works
obj2.foo(4); // Works as expected
}
В идеале я бы хотел, чтобы замена T была игнорирована для этой функции в случае, если t не является std :: complex . Это возможно? Если нет, как я могу это обойти?


Подробнее здесь: https://stackoverflow.com/questions/746 ... completely
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»