#include <initializer_list>
#include <iostream>
#include <string>
#include <type_traits>
using namespace std;
void fun (const std::initializer_list<std::string>& strings) {
for(auto s : strings)
cout << s << endl;
}
template <typename T>
struct HasValue
{
typedef char OK;
struct BAD { char x[2]; };
template <const string *>
struct Helper;
template <typename X>
static OK has(X*, Helper<&X::value>* = nullptr);
static BAD has(...);
static const bool value = (sizeof(has((T*)nullptr)) == sizeof(OK));
};
template <typename H, typename... T>
struct HaveValue : public integral_constant<bool, HasValue<H>::value && HaveValue<T...>::value>
{};
template <typename H>
struct HaveValue<H> : public HasValue<H>
{};
template <typename... Args>
void foo() {
static_assert(HaveValue<Args...>::value, "All arguments must have const string ::value");
fun({Args::value...});
}
struct A
{
static const string value;
};
const string A::value = "AA";
struct B
{
static const string value;
};
const string B::value = "BB";
struct C{};
int main()
{
foo<A, B>();
//foo<A, B, C>();
}
I2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgZnVuIChjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjpzdHJpbmc+JiBzdHJpbmdzKSB7CiAgZm9yKGF1dG8gcyA6IHN0cmluZ3MpCiAgICBjb3V0IDw8IHMgPDwgZW5kbDsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBIYXNWYWx1ZQp7CiAgICB0eXBlZGVmIGNoYXIgT0s7CiAgICBzdHJ1Y3QgQkFEIHsgY2hhciB4WzJdOyB9OwogICAgdGVtcGxhdGUgPGNvbnN0IHN0cmluZyAqPgogICAgc3RydWN0IEhlbHBlcjsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBYPgogICAgc3RhdGljIE9LIGhhcyhYKiwgSGVscGVyPCZYOjp2YWx1ZT4qID0gbnVsbHB0cik7CiAgICBzdGF0aWMgQkFEIGhhcyguLi4pOwogICAgCiAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IChzaXplb2YoaGFzKChUKiludWxscHRyKSkgPT0gc2l6ZW9mKE9LKSk7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSCwgdHlwZW5hbWUuLi4gVD4Kc3RydWN0IEhhdmVWYWx1ZSA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBIYXNWYWx1ZTxIPjo6dmFsdWUgJiYgSGF2ZVZhbHVlPFQuLi4+Ojp2YWx1ZT4Ke307Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSD4Kc3RydWN0IEhhdmVWYWx1ZTxIPiA6IHB1YmxpYyBIYXNWYWx1ZTxIPgp7fTsKCgoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CnZvaWQgZm9vKCkgewogICAgc3RhdGljX2Fzc2VydChIYXZlVmFsdWU8QXJncy4uLj46OnZhbHVlLCAiQWxsIGFyZ3VtZW50cyBtdXN0IGhhdmUgY29uc3Qgc3RyaW5nIDo6dmFsdWUiKTsKICAgIGZ1bih7QXJnczo6dmFsdWUuLi59KTsKfQoKc3RydWN0IEEKewogICAgc3RhdGljIGNvbnN0IHN0cmluZyB2YWx1ZTsKfTsKY29uc3Qgc3RyaW5nIEE6OnZhbHVlID0gIkFBIjsKCnN0cnVjdCBCCnsKICAgIHN0YXRpYyBjb25zdCBzdHJpbmcgdmFsdWU7Cn07CmNvbnN0IHN0cmluZyBCOjp2YWx1ZSA9ICJCQiI7CgpzdHJ1Y3QgQ3t9OwoKaW50IG1haW4oKQp7CiAgICBmb288QSwgQj4oKTsKICAgIC8vZm9vPEEsIEIsIEM+KCk7Cn0=