Как разделить тип возвращаемого значения функции и аргументы в параметре шаблона - PullRequest
1 голос
/ 19 октября 2019

Я хотел бы передать тип функции (например, int(float)) в шаблон класса, который отделяет тип возвращаемого значения от списка аргументов переменной:

template<typename R, typename... Args>
class CallFunction
{
public:
    R operator()(Args&&... args)
    {
        std::cout << ("" << ... << (args << "\n"));
        return R{100};
    }
};

int main()
{
    CallFunction<int(float)> cf;
    std::cout << "return value: " << cf(200.f) << "\n";
}

Я понимаю, что приведенный выше код неработай. В этом случае R равняется int(float) вместо просто int, как я ожидаю. Вот живой пример .

Я уже видел подобные хитрости шаблонов, и они действительно как-то работали. Я видел много ответов на SO относительно того, как это сделать, но для этого требуется действительный указатель на функцию. Здесь я указываю тип функции напрямую, поэтому decltype решение здесь не применимо.

Как мне это сделать? Я могу использовать до C ++ 17 для своего решения.

1 Ответ

4 голосов
/ 19 октября 2019

int(float) - это один тип (в частности, тип функции), поэтому ваш шаблон должен иметь только один тип. Но тогда вы можете использовать частичную специализацию, чтобы получить тип возвращаемого значения и типы аргумента.

template <typename>
class CallFunction; // This primary template is not defined.

template <typename R, typename... Args>
class CallFunction<R(Args...)>
{
public:
    R operator()(Args&&... args)
    {
        std::cout << ("" << ... << (args << "\n"));
        return R{100};
    }
};
...