gpt4 book ai didi

c++ - 如何在没有实例的情况下获取非静态方法的类型?

转载 作者:行者123 更新时间:2023-12-01 14:12:48 24 4
gpt4 key购买 nike

我正在尝试在 C++ 中创建一个模板函数,例如:

template<typename IteratorType>
double evaluate(const IteratorType &rBegin, const IteratorType &rEnd,
double(*function)( const decltype( *IteratorType ) &rObject )) // error, typename not allowed
// I'm unsure if I need to put the reference there, not part of the problem.
{
// ...
}
// not my actual code, just to show an example.

虽然这不起作用,因为我需要一个 class/struct 的实例来调用非静态方法,我不能这样做,因为它在一个函数中。在谷歌搜索了一下后,我找到了这个解决方案:


double(*function)( const typename std::iterator_traits<IteratorType>::value_type &rObject )

尽管您可以看到这使用起来很笨拙(并且很难更改),尤其是当您尝试创建多个重载时。这似乎也不适用于我的迭代器,所以过了一会儿我意识到了这一点:

double(*function)( const typename IteratorType::value_type &rObject)

将是最好的解决方案。

最后我意识到不能保证“IteratorType”将value_type定义为值的类型,并且指针是一个东西。

有什么办法让我摆脱类似的事情

double(*function)( const decltype(*IteratorType) &robject)

?

最佳答案

首先,您需要一个最小的示例来解决您的问题。以下是我从您的评论中了解到的:

#include <iostream>
#include <vector>
#include <string>

struct MyClass /* final */
{
static double member(std::string const& val) /* noexcept */
{
std::cout << "double MyClass::member(int val): " << val << "\n";
return {}; // return appropriate results
}
};

template<typename IteratorType>
void evaluate(IteratorType rBegin, const IteratorType rEnd,
// WHAT??? other than:
// double(*function)(const typename std::iterator_traits<IteratorType>::value_type &rObject )
{
while (rBegin != rEnd)
{
function(*rBegin);
++rBegin;
}
}

int main()
{
std::vector<std::string> vec{ "1", "2", "3"};
evaluate(vec.cbegin(), vec.cend(), &MyClass::member);
}

Though as you can see this gets clumsy to use [...]

除了 @Const's answer ,如果您的问题是使用 std::iterator_traits,您还有以下两个选项。

  • 选项 - I

    喜欢 @chtz 评论中提到,使用 std::declval获取迭代器的下划线类型如下:

    template<typename IteratorType>
    void evaluate(IteratorType rBegin, const IteratorType rEnd,
    double(*function)(
    std::remove_reference_t<decltype(*std::declval<IteratorType>())> const&))
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--> value_type == std::string
    {
    // ... code
    }

    在那里提供一个帮助模板类型别名并不是一个坏主意:

    template<typename IteratorType>
    using ValueType = std::remove_reference_t<decltype(*std::declval<IteratorType>())>;

    template<typename IteratorType>
    void evaluate(IteratorType rBegin, const IteratorType rEnd,
    double(*function)(ValueType<IteratorType> const&))
    // ^^^^^^^^^^^^^^^^^^^^^^^ value_type == std::string
    {
    // ... code
    }

    (See live demo)

  • 选项 - II

    rBegin,通过将 T& 转换为 T 使用 std::remove_reference_t .


    template<typename IteratorType>
    void evaluate(IteratorType rBegin, const IteratorType rEnd,
    double(*function)(std::remove_reference_t<decltype(*rBegin)> const&))
    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ---> std::string
    {
    // ... code
    }

    (See live demo)

关于c++ - 如何在没有实例的情况下获取非静态方法的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62549227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com