小编Tom*_*shu的帖子

在模板中获取函数返回类型

如何为传递给模板的任何函数获取返回类型?
我不知道如何转换template<typename T>template<typename Result, typename Args...>:

template<typename T>
void print_name(T f)
{
    static_assert(internal::is_function_pointer<T>::value
            || std::is_member_function_pointer<T>::value,
            "T must be function or member function pointer.");
    typename decltype(f(...)) Result; // ???
    typename std::result_of<T>()::type Result; // ???
    printf("%s\n", typeid(Result).name());
}

void f_void() {}
int f_int(int x) { return 0; }
float f_float(int x, int y) { return 0.f; }
struct X { int f(int x, float y) { return 0; } };

int main()
{
    print_name(f_void);
    print_name(f_int);
    print_name(f_float);
    print_name(&X::f);
    return …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++14

6
推荐指数
2
解决办法
2264
查看次数

无法从'initializer-list'转换为'std :: initializer_list <Keyword>&'

我正在尝试使用初始化列表将关键字列表传递给tokenizer进行注册.但它在Visual Studio 2013中不起作用.它适用于ideone.com上的gcc.有没有办法在VS中使用这个或类似的语法?

struct Keyword
{
    const char* name;
    int id;
};

void AddKeywords(int group, std::initializer_list<Keyword>& lis) {}

// usage
AddKeywords(ITEM_TYPE, {
    { "weapon", IT_WEAPON },
    { "armor", IT_ARMOR }
});
Run Code Online (Sandbox Code Playgroud)

完整错误:

item.cpp(810): error C2664: 'void AddKeywords(int,std::initializer_list<Keyword> &)' : cannot convert argument 2 from 'initializer-list' to 'std::initializer_list<Keyword> &'
Run Code Online (Sandbox Code Playgroud)

c++ initializer-list c++11 visual-studio-2013

2
推荐指数
1
解决办法
4311
查看次数