Имея этот шаблон:
template <bool X>
struct Foo {
Foo(int v) : v(v) {}
int v;
};
Я могу сказать, что по умолчанию Foo
должно быть False
с инструкцией по вычету:
Foo(int)->Foo<false>;
Спасибо за то, что этот код работает :
Foo a = 5;
Моя проблема в том, как мне сделать эту работу, когда Foo
используется в качестве аргумента функции:
template <bool X>
void f(Foo<X> foo) {
cout << "Foo<" << X << ">(" << foo.v << ")" << endl;
}
f(5); // error: no matching function for call to 'f'
// candidate template ignored: could not match 'Foo<X>' against 'int'
Я пытался как-то сказать f
, что X
по умолчанию false
, но f
(я имею в виду компилятор) меня не слушает:
template <bool X = false> // = false changes nothing, same error
void f(Foo<X> foo) {
cout << "Foo<" << X << ">(" << foo.v << ")" << endl;
}
template <bool X>
struct get_bool { // to force looking at f::X
static constexpr bool value = X;
};
template <bool X = false>
void f(Foo<get_bool<X>::value> foo) {
cout << "Foo<" << X << ">(" << foo.v << ")" << endl;
/* this is not working because
* get_bool evaulates before
* args matching and in the end,
* this function could be defined
* as: void f(Foo<false>)
*/
}
Я не возражаю против введения некоторых дополнительных вспомогательных классов и т. Д. c , Я надеялся, что, возможно, некоторые decltype
, auto
, some_trait<>
или дополнительный класс помощника (ов) маги c могли бы помочь здесь решить эту проблему, которую, я думаю, я также мог бы подытожить следующим образом: Как определить руководство по удержанию для функции?