在C ++

时间:2017-08-10 12:02:54

标签: c++ function-parameter

我在C ++中有点生疏,经过一年的python后我才开始转换。当然,我想把python的懒惰翻译成C ++。

我刚刚发现了rot13,我对此感到很兴奋。我找到了3种方法,我想做一点性能测试。 我还想看看在修改字符串或创建新字符串时是否存在差异。所以我最终有6个功能。

在第一种方法中,我使用std :: map来映射字符,因此我构建了一个初始化地图的类,在第二个中我使用了三元运算符,第三个我使用了一点移。

现在函数原型看起来像这样

// map dependent
void Rot13::convert_inplace(string& mystr){

string Rot13::convert(const string& mystr){

// ternary operator
void bitrot_inplace(string& mystr){

string bitrot(const string&  mystr){

// bit shift
void bitshiftrot_inplace(string& mystr){

string bitshiftrot(const string& mystr){

我想构造一个函数,接受这些函数作为参数,然后计算时间并打印结果

所以我看了一下stackoverflow,12,我想出了这个

typedef void (*vfc)(string str);

void printtime_inplace(string title, vfc func){

我尝试了这种结构但这意味着我受vfc返回类型的限制,在我的情况下,voidstring,并且我需要传递类的指针。 因此,我将不得不做3个函数来容纳不同的函数,即类成员函数的函数,void返回类型的函数和字符串返回类型的函数。

所以我问自己,这是否真的需要使用模板不写3次相同的功能?我对模板真的没有信心,但是我应该做3 typedefs并构建printtime函数来接受模板吗?此外,有没有办法告诉模板你只接受这些类型(即我定义的那个)?

另一个问题是,这是不是说一个好的设计?或者你会建议其他设计?另一种实现?

3 个答案:

答案 0 :(得分:2)

IMO最简单的方法是使用模板而不是尝试编写具体类型的函数。

template<typename Function>
void printtime_inplace(string title, Function func)
{
    //...
    func(title);
    //...
}

现在,您可以使用任何“功能”。你可以传递一个常规函数,一个函子,一个lambda,一个std::function,基本上,任何可调用的。编译器将为您删除不同的实例,但就您的代码而言,您调用相同的函数。

答案 1 :(得分:2)

您可以使用std::function提供此类模板:

#include <iostream>
#include <functional>
#include <string>
#include <type_traits>

void convert_inplace(std::string& mystr){}
std::string convert(const std::string& mystr){
    return mystr;
}
void bitrot_inplace(std::string& mystr){}

template<typename ret, typename par>
using fn = std::function<ret(par)>;

template<typename ret, typename par>
void caller(fn<ret,par> f) {
    typename std::remove_reference<par>::type p;
    ret r = f(p);
}

template<typename par>
void caller(fn<void,par> f) {
    typename std::remove_reference<par>::type p;
    f(p);
}

int main() {
    auto f1 = fn<void,std::string&>(convert_inplace);
    auto f2 = fn<std::string,const std::string&>(convert);
    auto f3 = fn<void,std::string&>(bitrot_inplace);
    caller(f1);
    caller(f2);
    caller(f3);
    return 0;
}

请参阅live demo

答案 2 :(得分:0)

如果您想要一个带有可变参数的函数,这里有一个基于 user0042 的答案的示例(另见 https://github.com/goblinhack/c-plus-plus-examples/blob/master/std_function_with_variadic_template/README.md

if Yes == Yes 

if No == No