std :: is_reference from std :: any

问题描述 投票:2回答:1

有点卡住。

尝试从我的模板类内部检查参数是否为引用类型

似乎在功能中起作用。

但是在我的函数包装器中,它总是返回true。

#include <vector>
#include <any>

template <class T>
T CallFunction(const std::vector<std::any>& args) {
    for (size_t i = args.size(); i > 0; i--) {
        std::cout << std::boolalpha << std::is_reference<decltype(args[i-1].type())>::value << std::endl; // always true
    }
    return T();
}

template<typename Fn> class FunctionBase;
template<typename R, typename... Args>
class FunctionBase <R(__cdecl*)(Args...)> {
public:
    FunctionBase() {}
    R operator()(Args... args) {
        return CallFunction<R>({ args ... });
    }

};

int foo(int a, int& b) {
    std::cout << std::boolalpha << std::is_reference<decltype(a)>::value << std::endl; // falae
    std::cout << std::boolalpha << std::is_reference<decltype(b)>::value << std::endl; // true
    return a + b;
}

int main() {
    int in = 10;
    foo(1, in);

    FunctionBase<decltype(&foo)> func;
    func(1, in);
}
c++ c++17
1个回答
0
投票

我认为您想要实现的目标更像是这样:https://gcc.godbolt.org/z/-rQ6jG

您想声明为universal referenceR operator()(Args... args)中缺少perfect forwarding中的CallFunction,然后是template <class T, class Arg> CallFunction(Arg&&),然后使用Arg = int实例化了Arg = int&CallFunction<R>(std::forward<Args>(args))... ]在您的FunctionBase类中。

#include <vector>
#include <any>
#include <iostream>

template <class T, class Arg>
T CallFunction(Arg&&) {
    std::cout << std::boolalpha << std::is_reference<Arg>::value << std::endl; // not always true
    return T();
}

template<typename Fn> class FunctionBase;
template<typename R, typename... Args>
class FunctionBase <R(*)(Args...)> {
public:
    FunctionBase() {}

    R operator()(Args&&... args) { // Args&& is a universal reference
        // Here we use perfect forwarding so that Args type does not change
        std::initializer_list<R>{CallFunction<R>(std::forward<Args>(args)) ...};
        return R();
    }
};

程序现在将打印:

Program returned: 0

false

true

false

true
© www.soinside.com 2019 - 2024. All rights reserved.