#include <vector>
#include <unordered_set>
#include <algorithm>
#include <functional>
template<typename V, typename... Args>
void autoEmplace(V& vec, Args&& ...args)
{
return autoEmplace(typename std::is_pod<
typename V::value_type>::type(), vec,
std::forward<Args>(args)...);
}
template<typename V, typename... Args>
void autoEmplace(std::true_type, V& vec, Args&& ...args)
{
vec.push_back({std::forward<Args>(args)...});
}
template<typename V, typename... Args>
void autoEmplace(std::false_type, V& vec, Args&& ...args)
{
vec.emplace_back(std::forward<Args>(args)...);
}
#include <iostream>
struct Foo {
int i;
short n;
};
struct Bars {
int i;
double n;
};
using Lol = std::unordered_set<int>;
int main() {
Foo foo{42}; //fine
std::vector<Foo> v;
std::vector<Bars> b;
std::vector<Lol> h;
autoEmplace(v, 42);
autoEmplace(b, 42, 3.14159265358979323);
autoEmplace(h, 10, std::hash<int>(), std::equal_to<int>());
std::cout << v.back().i << std::endl;
std::cout << b.back().n << std::endl;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgoKdGVtcGxhdGU8dHlwZW5hbWUgViwgdHlwZW5hbWUuLi4gQXJncz4Kdm9pZCBhdXRvRW1wbGFjZShWJiB2ZWMsIEFyZ3MmJiAuLi5hcmdzKQp7CglyZXR1cm4gYXV0b0VtcGxhY2UodHlwZW5hbWUgc3RkOjppc19wb2Q8CgkJdHlwZW5hbWUgVjo6dmFsdWVfdHlwZT46OnR5cGUoKSwgdmVjLAoJCXN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFYsIHR5cGVuYW1lLi4uIEFyZ3M+CnZvaWQgYXV0b0VtcGxhY2Uoc3RkOjp0cnVlX3R5cGUsIFYmIHZlYywgQXJncyYmIC4uLmFyZ3MpCnsKCXZlYy5wdXNoX2JhY2soe3N0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLn0pOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBWLCB0eXBlbmFtZS4uLiBBcmdzPgp2b2lkIGF1dG9FbXBsYWNlKHN0ZDo6ZmFsc2VfdHlwZSwgViYgdmVjLCBBcmdzJiYgLi4uYXJncykKewoJdmVjLmVtcGxhY2VfYmFjayhzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwp9CgojaW5jbHVkZSA8aW9zdHJlYW0+CgpzdHJ1Y3QgRm9vIHsKCWludCBpOwoJc2hvcnQgbjsKfTsKCnN0cnVjdCBCYXJzIHsKCWludCBpOwoJZG91YmxlIG47Cn07Cgp1c2luZyBMb2wgPSBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50PjsKCmludCBtYWluKCkgewoJRm9vIGZvb3s0Mn07IC8vZmluZQoJc3RkOjp2ZWN0b3I8Rm9vPiB2OwoJc3RkOjp2ZWN0b3I8QmFycz4gYjsKCXN0ZDo6dmVjdG9yPExvbD4gaDsKCWF1dG9FbXBsYWNlKHYsIDQyKTsKCWF1dG9FbXBsYWNlKGIsIDQyLCAzLjE0MTU5MjY1MzU4OTc5MzIzKTsKCWF1dG9FbXBsYWNlKGgsIDEwLCBzdGQ6Omhhc2g8aW50PigpLCBzdGQ6OmVxdWFsX3RvPGludD4oKSk7CglzdGQ6OmNvdXQgPDwgdi5iYWNrKCkuaSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgYi5iYWNrKCkubiA8PCBzdGQ6OmVuZGw7Cn0=
prog.cpp: In instantiation of 'void autoEmplace(V&, Args&& ...) [with V = std::vector<std::unordered_set<int> >; Args = {int, std::hash<int>, std::equal_to<int>}]':
prog.cpp:47:59: required from here
prog.cpp:9:20: error: invalid initialization of non-const reference of type 'std::integral_constant<bool, false>&' from an rvalue of type 'std::integral_constant<bool, false>::type {aka std::integral_constant<bool, false>}'
return autoEmplace(typename std::is_pod<
^
prog.cpp:7:6: note: initializing argument 1 of 'void autoEmplace(V&, Args&& ...) [with V = std::integral_constant<bool, false>; Args = {std::vector<std::unordered_set<int, std::hash<int>, std::equal_to<int>, std::allocator<int> >, std::allocator<std::unordered_set<int, std::hash<int>, std::equal_to<int>, std::allocator<int> > > >&, int, std::hash<int>, std::equal_to<int>}]'
void autoEmplace(V& vec, Args&& ...args)
^
prog.cpp:11:30: error: return-statement with a value, in function returning 'void' [-fpermissive]
std::forward<Args>(args)...);
^