[C++] Как сделать Type -> const Type & в parameters pack?

apl13

#include <iostream>
#include <type_traits>

void test() {}

// the following strips const qualifiers, thus commented out
// template<typename Arg, typename... Args> void test(Arg a, Args ... as) {
template<typename Arg, typename... Args> void test(Arg &a, Args &... as) {
std::cout << std::is_const<Arg>::value << std::endl;
test(as...);
}

int main() {
int a;
const int b = 10;
std::cout << std::boolalpha;
test(a, b, a, b); // this prints "false\ntrue\nfalse\ntrue\n"
// test(a, b, a, b, 10); // this doesn't compile
}

Проблема в предпоследней строчке. 10 типизируется как int, и поэтому не получается правильной перегрузки. Люди, привыкшие писать const & везде, где можно, даже не обращают внимания на то, что это неявное преобразование. А тут не получается.
Можно как-нибудь обойти?
ЗЫ. gcc 4.7.2.

Maurog

Можно как-нибудь обойти?
вопрос не понял, но накину идею с rvalue-ref + perfect forward
пример: http://ideone.com/JRftc8

agent007new

Не совсем уверен, что ты это имел ввиду, но вот мой вариант. Теперь строчка
test(a, b, a, b, 10);
компилится и выдает результат:
false
true
false
true
true


#include <iostream>
#include <ios>
#include <type_traits>
#include <utility>

using namespace std;

template <typename T>
void test_impl(T&)
{
cout << "false" << endl;
}

template <typename T>
void test_impl(const T&)
{
cout << "true" << endl;
}

void test() {}

template<typename Arg, typename... Args> void test(Arg&& a, Args&& ... as) {

test_impl(std::forward<Arg>(a));
test(std::forward<Args>(as)...);
}

int main() {

int a;

const int b = 10;

std::cout << std::boolalpha;

//test(a, b, a, b); // this prints "false\ntrue\nfalse\ntrue\n"
test(a, b, a, b, 10); // this prints "false\ntrue\nfalse\ntrue\ntrue"

}


apl13

Спасибо, шаманы.
Оставить комментарий
Имя или ник:
Комментарий: