Date: Sun, 19 Dec 2021 20:35:07 +0100
Hello,
So, let's just allow use of a types and static constants from
not-instantiation-ed template class (if possible):
template<typename T>
struct Foo{
constexpr static int bar = 0x01;
};
int i = Foo::bar; // Doesn't compile now, but could
int j = Foo<class Nonexisting>::bar; // Ugly hack but works
This improvement should make template configuration behave similar to
class usages.
Classes frequently uses internal class constants, e.g.
"std::cout.setf(std::ios::hex, std::ios::basefield)".
So this change would allow to include constants and types used to
configure template, inside it.
Ideally, those should be visible inside template-initialization-list
without scope operators.
HelloWorld example:
So, let's just allow use of a types and static constants from
not-instantiation-ed template class (if possible):
template<typename T>
struct Foo{
constexpr static int bar = 0x01;
};
int i = Foo::bar; // Doesn't compile now, but could
int j = Foo<class Nonexisting>::bar; // Ugly hack but works
This improvement should make template configuration behave similar to
class usages.
Classes frequently uses internal class constants, e.g.
"std::cout.setf(std::ios::hex, std::ios::basefield)".
So this change would allow to include constants and types used to
configure template, inside it.
Ideally, those should be visible inside template-initialization-list
without scope operators.
HelloWorld example:
---
#include <iostream>
// T needed for some functionality not listed here
template <typename T, int flags>
struct HelloWorld
{
static constexpr int Hello = 0x1;
static constexpr int World = 0x2;
static constexpr int Exclamation = 0x4;
void work(){
if (flags & Hello) // <- no code for this line
std::cout << "Hello ";
if (flags & World) // <- no code for this line
std::cout << "World";
if (flags & Exclamation) // <- no code for this line
std::cout << "!\n";
}
};
int main()
{
HelloWorld<int, Hello | World | Exclamation>{}.work(); // Prints
"Hello World!"
return 0;
}
---
Currently types and constants have to be defined before template,
polluting higher scope. Or ugly hack used:
HelloWorld<int, HelloWorld<void*, 0>::Hello |
HelloWorld<std::iostream, -1>::World | HelloWorld<class Nonexisting,
3141592>::Exclamation>{}.work();
You can see this yourself in Compiler Explorer:
https://godbolt.org/z/s6MP7sqz5
Regards,
Maciej
Received on 2021-12-19 13:35:16
