using для шаблонных функций
От: пффф  
Дата: 18.08.24 14:02
Оценка:
Привет!


Есть семейство шаблонных функций template<StringType> StringType do_something(...) в NS my::nested::nspace.

Стало лень выписывать это всё целиком.

Решил написать:
template<typename StringType>
using do_something = my::nested::nspace::do_something<StringType>;


А тут мне и говорят: error: 'do_something<StringType>' in namespace 'my::nested::nspace' does not name a type.

Получается, using не такой классный, как хотелось бы? Можно как-то выкрутится, кроме как написать всё семейство функций в текущем NS в виде прокси и отфорвардив реализацию к оригинальным функциям?
Re: using для шаблонных функций
От: Великий Реверс google
Дата: 18.08.24 14:04
Оценка:
на годболте уже забанили?
хотя и так скорее всего понятно что нужен typename в нужном месте
Re[2]: using для шаблонных функций
От: пффф  
Дата: 18.08.24 14:21
Оценка:
Здравствуйте, Великий Реверс, Вы писали:

ВР>на годболте уже забанили?

ВР>хотя и так скорее всего понятно что нужен typename в нужном месте

И где же он нужен?
Re: using для шаблонных функций
От: so5team https://stiffstream.com
Дата: 18.08.24 14:23
Оценка:
Здравствуйте, пффф, Вы писали:

П>Получается, using не такой классный, как хотелось бы?


А кто-то говорил, что using для чего-то кроме типов?

П>Можно как-то выкрутится, кроме как написать всё семейство функций в текущем NS в виде прокси и отфорвардив реализацию к оригинальным функциям?


Например:
#include <string>
#include <iostream>

namespace my
{

template<typename StringType>
struct to_s_functor {
    template<typename T>
    StringType operator()(T && v) const {
        return std::to_string(std::forward<T>(v));
    }
};

} /* namespace my */

namespace another {

class wrapped_str {
    std::string m_v;
public:
    wrapped_str(std::string v) : m_v{std::move(v)} {}

    friend std::ostream &
    operator<<(std::ostream & to, const wrapped_str & ws) {
        return to << "`" << ws.m_v << "'";
    }
};

} /* namespace another */

template<typename StringType>
inline constexpr my::to_s_functor<StringType> to_s;

int main()
{
    std::cout << to_s<std::string>(1.0) << std::endl;
    std::cout << to_s<std::string>(100500llu) << std::endl;
    std::cout << to_s<another::wrapped_str>(200600ll) << std::endl;
    std::cout << to_s<another::wrapped_str>(3.14f) << std::endl;
}

Цинк: https://wandbox.org/permlink/7dLELe45g9J0SzQ0
Re[2]: using для шаблонных функций
От: пффф  
Дата: 18.08.24 14:52
Оценка: -1 :))
Здравствуйте, so5team, Вы писали:

П>>Получается, using не такой классный, как хотелось бы?


S>А кто-то говорил, что using для чего-то кроме типов?



https://en.cppreference.com/w/cpp/language/namespace

using ns-name :: member-name ; (6)
6) using-declaration: makes the symbol member-name from the namespace ns-name accessible for unqualified lookup as if declared in the same class scope, block scope, or namespace as where this using-declaration appears.


Тут ничего про такое ограничение не написано.
Хотя, это старый синтаксис using'а, про который я забыл.
Новый, действительно, вроде как только про типы.

У старого проблемка есть — не работает в class-scope, а хотелось. Но в функциях работает, и то хорошо
Re[3]: using для шаблонных функций
От: so5team https://stiffstream.com
Дата: 18.08.24 15:19
Оценка:
Здравствуйте, пффф, Вы писали:

П>https://en.cppreference.com/w/cpp/language/namespace

П>

П>using ns-name :: member-name ; (6)
П>6) using-declaration: makes the symbol member-name from the namespace ns-name accessible for unqualified lookup as if declared in the same class scope, block scope, or namespace as where this using-declaration appears.


П>Тут ничего про такое ограничение не написано.


Вы бы, блин, еще бы нашли цитату для using-а, который для унаследованных из базовых классов методов используется, типа такого:
class Base {
public:
  Base(int i, float f) {...}
  ...
};

class Derived : public Base {
public:
  using Base::Base;
  ...
};


У ключевого слова using в C++ много назначений: https://en.cppreference.com/w/cpp/keyword/using
Конкретно в вашем стартовом сообщении речь идет об вот этом using-е: https://en.cppreference.com/w/cpp/language/type_alias

И раз вопрос был про такой using, то неужели кто-то обещал, что этот using для чего-то кроме типов применим?
Re[4]: using для шаблонных функций
От: пффф  
Дата: 18.08.24 16:03
Оценка:
Здравствуйте, so5team, Вы писали:

S>У ключевого слова using в C++ много назначений: https://en.cppreference.com/w/cpp/keyword/using

S>Конкретно в вашем стартовом сообщении речь идет об вот этом using-е: https://en.cppreference.com/w/cpp/language/type_alias

S>И раз вопрос был про такой using, то неужели кто-то обещал, что этот using для чего-то кроме типов применим?


Какой using я хотел, я словами описал. А в коде использовал не тот using, да
Re[5]: using для шаблонных функций
От: so5team https://stiffstream.com
Дата: 18.08.24 16:34
Оценка:
Здравствуйте, пффф, Вы писали:

П>Какой using я хотел, я словами описал.


Вероятно, вы хотели using namespace.
namespace some::my::ns {

namespace funcs {

// Здесь ваши шаблонные функции.
template<typename StringType>
StringType do_something(Arg1 arg) {...}

template<typename StringType>
StringType do_something(Arg1 arg, Arg2 arg2) {...}

template<typename StringType>
StringType do_something(Arg1 arg, Arg2 arg2, Arg3 arg3) {...}
...

} // namespace funcs

// Это чтобы do_something можно было использовать напрямую внутри some::my::ns.
using namespace funcs;

...
} // namespace some::my::ns

// Это чтобы do_something можно было использовать напрямую, но не беря лишнего
// из some::my::ns.
using namespace some::my::ns::funcs;
Re[6]: using для шаблонных функций
От: пффф  
Дата: 18.08.24 16:37
Оценка:
Здравствуйте, so5team, Вы писали:

П>>Какой using я хотел, я словами описал.


S>Вероятно, вы хотели using namespace.


Нет, я хотел юзинг конкретного имени из NS, и я его сделал:
using some::my::ns::do_something;


Правда, это только внутри функций работает, не в классе, но и так норм
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.