Вложенные шаблоны в C ++ - PullRequest
       2

Вложенные шаблоны в C ++

2 голосов
/ 30 декабря 2010

Я хочу шаблонировать одну функцию для повторного использования и специализации кода.

Сигнатура функции - это что-то вроде int DoStuff(FooBar &a);, где FooBar - Foo<BarX>, то есть экземпляр шаблона, который я не могу набрать typedefзаранее.

Я пытался сделать template <class T> int DoStuff(Foo<T> &a); и template <class T> int DoStuff(T &a);, но я получаю обычные ошибки зашифрованного компоновщика, которые даже немного не помогают.

Не удалось найтиучебники по этой теме, которые можно найти только для упрощенного использования шаблонов.

Код будет называться так:

Foo<Bar1> var1;
int res1 = DoStuff(var1);
Foo<Bar2> var2;
int res2 = DoStuff(var2);
etc.

Я пытаюсь сделать что-то невозможное?

Ответы [ 3 ]

3 голосов
/ 30 декабря 2010

Код, который вы предложили: template <class T> int DoStuff(Foo<T> &a); должен работать. Обратите внимание, что, как и в случае с шаблонными структурами / классами, код функции должен быть видимым там, где используется функция (т. Е. Код функции обычно должен быть в заголовке).

1 голос
/ 30 декабря 2010

Нет, это вполне возможно при специализации на шаблонах.

#include <iostream>

template <typename T>
class Foo {};

template <typename T>
void DoStuff(const T& val)
{
    std::cout << val << std::endl;
}

template <typename T>
void DoStuff(const Foo<T>& val)
{
    std::cout << "Sorry, I can not print Foos" << std::endl;
}

int main()
{
    Foo<int> b;
    DoStuff(b);
    DoStuff(5);
}

Выход:

Sorry, I can not print Foos
5

Если вы хотите, чтобы он работал только для экземпляров Foo, определите DoStuff следующим образом:

template <typename T>
void DoStuff(const T& val);

template <typename T>
void DoStuff(const Foo<T>& val)
{
    std::cout << "Foosome argument" << std::endl;
}

Кроме того, вы можете занести в черный список, белый список или специализировать любой экземпляр Foo.

1 голос
/ 30 декабря 2010

У меня нет никаких проблем с этим. Вот пример, скомпилированная программа:

#include <iostream>
#include <cstdlib>

template<typename T> class Foo{};
class Bar1{};
class Bar2{};

template<typename T> int DoStuff(Foo<T>& ref) { return rand(); }

int main(int argc, char* argv[])
{
    Foo<Bar1> var1;
    int res1 = DoStuff(var1);
    std::cout << "res1 = " << res1 << std::endl;

    Foo<Bar2> var2;
    int res2 = DoStuff(var2);
    std::cout << "res2 = " << res2 << std::endl;

    return 0;
}

Что именно вы пытаетесь достичь? Я подозреваю, что ваши ошибки могут быть результатом слишком большого количества перегрузок, так что существует множество допустимых перегрузок, и, следовательно, это неоднозначно. Вы предоставляете как перегрузку для DoStuff(Foo&), так и для DoStuff(T&)? Попробуйте использовать только один.

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