Kompilator Konkretyzuje Szablon tam ggdzie nie powinien

0

cześć mam kolejny problem

chcę (dla sportu) przekazać n-argumentów, a do kontenera skierowac te odpowiednie

np i tu jest problem
już wiem jak rozróżnić odpowiednie, ale jak potem te odpowiednie zachować?

cały czas mam bład konwersji

Error C2446 ':': no conversion from 'std::string' to 'const int'

template<typename T>
class processor
{
void push_front(const T &value)
	{}

public:
template<typename ...Type>
    std::thread parse_data(const Type& ...t)
     {
                   const auto &add_proper_value = [&](const auto &pos)
		   {
                     if((std::is_same<decltype(pos), T>::value || std::is_convertible<decltype(pos), T>::value) //nie działa
		          push_front(pos);;
                  };

		(void)std::initializer_list<int>{(((std::is_same<Type, T>::value || std::is_convertible<Type, T>::value) ? add_proper_value(t) :nullptr, 0)...};//nie działa
     }
}

ma ktoś pomysł jak to ogarnąć?

0

Wrzucaj całe testcase'y, aby nie trzeba było się domyślać o co chodzi.

Domyślam się, że problemem jest to, że używasz zwykłego ifa, który nawet jeśli ma w warunku wyrażenie stałe w czasie kompilacji to wymaga kompilującego się kodu w obu odnogach:

using T = int;
if(is_same<T, string>()) // zawsze false
    T foo = "42";        // błąd, mimo że nigdy tu nie wejdzie

Aby tego uniknąć musisz użyć if constexpr z C++17 lub dispatchować po typie:

template<typename T>
void foo_impl(T&& t, false_type)
{
    BARK;
    DBG_LINE(t);
}

template<typename T>
void foo_impl(T&& t, true_type)
{
    BARK;
    DBG_LINE(t);
}

template<typename T>
void foo(T&& t)
{
    foo_impl(forward<T>(t), is_same<decay_t<T>, string>{});
}

https://wandbox.org/permlink/CphvsUU84K7iNK5n

takie foo możesz już bezpiecznie wywołać w initializer liście.

1 użytkowników online, w tym zalogowanych: 0, gości: 1