Условный шаблон - PullRequest
       0

Условный шаблон

0 голосов
/ 24 января 2020

У меня есть класс с шаблоном. Внутри этого класса есть переменная T * Variable; и переменная строка str; и есть функция с частью кода:

if(std::is_same<T, string>::value){
    *Variable = str;
    return 0;
}

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

Assign(Variable, &str);

А перед классом:

template <typename T, typename U>
conditional <T, U> void Assign(T* to, U* from){
    ;
}
conditional <string, string> void Assign(T* to, U* from){
    *to = *from;
}

Таким образом, компилятор выбрал бы специализированный один для моей нужной строки. Как это сформулировать? Можно ли это сформулировать только для переменных типов или мне нужен третий аргумент? Или может быть какое-то условие шаблона только для основного кода внутри функции?

Ответы [ 3 ]

2 голосов
/ 24 января 2020

Просто используйте специализацию шаблона:

template<typename T>
class Foo {
    T * Variable;

public:
    explicit Foo(T *p) : Variable{p}
    {}

    void Assign(const std::string& str) {
        std::cout << str << " No op\n";
    }
};

template<>
void Foo<std::string>::Assign(const std::string& str) {
    *Variable = str;
}

https://wandbox.org/permlink/Oi1bl8LCQQQ2LyJC

Это будет работать с довольно старой версией C ++ (по крайней мере C++03).

1 голос
/ 24 января 2020

Если у вас есть доступ к C ++ 17, просто используйте if constexpr:

if constexpr (std::is_same<T, string>::value) {
    *Variable = str;
    return 0;
}
0 голосов
/ 24 января 2020

Итак, я написал функцию Assign перед моим классом с шаблоном и специализацией шаблона

template<typename T, typename U>
void Assign(T* to, U* from){
    ;
}
template<>
void Assign(string* to, string* from){
    *to = *from;
}

И я изменил строку * Variable = str; into:

Assign(Variable, &str);

Вот топи c, которая помогла мне: Шаблонные функции .. ОШИБКА: идентификатор шаблона не соответствует ни одному объявлению шаблона

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...