bryan sammon
bryan sammon

Reputation: 7441

Deducing Non-Type Template Argument Unsigned Int / size_t

Im trying to deduce a non-type template argument.

#include <iostream>

template <unsigned int S>
void getsize(unsigned int s) { std::cout << s << std::endl; }

int main()
{
  getsize(4U); 
// Id like to do this without explicitly stating getsize<4U>(4);
// or even getsize<4U>(); 
// Is this possible?
}

But I am getting error:

deduce_szie_t.cpp: In function 'int main()':
deduce_szie_t.cpp:9:15: error: no matching function for call to 'getsize(unsigned int)'
deduce_szie_t.cpp:9:15: note: candidate is:
deduce_szie_t.cpp:4:6: note: template<unsigned int <anonymous> > void getsize(unsigned int)
deduce_szie_t.cpp:4:6: note:   template argument deduction/substitution failed:
deduce_szie_t.cpp:9:15: note:   couldn't deduce template parameter '<anonymous>'

Is it possible to deduce the unsigned int, without having to explicitly state the template parameter?

Id like to have it clean like: getsize(4U) I want to avoid writing: getsize<4U>()

Thanks alot for any help

Upvotes: 4

Views: 1834

Answers (3)

Steve Jessop
Steve Jessop

Reputation: 279255

It is possible to deduce a non-type template argument from function arguments, but not in the way you want. It can only be deduced from the type of the function argument, not from the value.

For example:

template <unsigned int S>
void getsize(int (*s)[S]) {
    std::cout << "pointer value: " << (void*)s << std::endl;
    std::cout << "deduced size: " << S << std::endl;
}

getsize(static_cast<int (*)[4]>(0));

Upvotes: 5

WhozCraig
WhozCraig

Reputation: 66204

Something wrong with doing this (I think this is what you want??)

#include <iostream>

template<typename Ty>
void getsize(Ty t) { std::cout << t << std::endl; };

int main(int argc, char *argv[])
{
    getsize(4U);
    return 0;
}

Upvotes: 2

Kerrek SB
Kerrek SB

Reputation: 477040

The following code mentions the number 4 a minimal number of times:

template <unsigned int N>
void getsize()
{
    std::cout << N << std::endl;
}

int main()
{
    getsize<4>();
}

You can't possibly mention the number less than one time.

Upvotes: 2

Related Questions