programing

C ++에서 함수 이름에 별칭을 어떻게 할당합니까?

nasanasas 2020. 9. 3. 19:31
반응형

C ++에서 함수 이름에 별칭을 어떻게 할당합니까?


유형, 변수 또는 네임 스페이스의 새 이름을 만드는 것은 쉽습니다. 하지만 함수에 새 이름을 어떻게 할당합니까? 예를 들어, 내가 이름을 사용하려는 holler위해 printf. #define은 분명합니다 ... 다른 방법은 없나요?

해결책 :

  1. #define holler printf
  2. void (*p)() = fn; //function pointer
  3. void (&r)() = fn; //function reference
  4. inline void g(){ f(); }

다양한 접근 방식이 있습니다.

  • 템플릿이 아닌 오버로드되지 않은 함수가있는 C ++ 11에서는 다음을 간단히 사용할 수 있습니다.

    const auto& new_fn_name = old_fn_name;
    
  • 이 함수에 여러 오버로드가있는 경우 다음을 사용해야합니다 static_cast.

    const auto& new_fn_name = static_cast<OVERLOADED_FN_TYPE>(old_fn_name);
    

    예 : 함수의 과부하가 두 개 있습니다. std::stoi

    int stoi (const string&, size_t*, int);
    int stoi (const wstring&, size_t*, int);
    

    첫 번째 버전에 별칭을 만들려면 다음을 사용해야합니다.

    const auto& new_fn_name = static_cast<int(*)(const string&, size_t*, int)>(std::stoi);
    

    참고 : 오버로드 된 모든 버전이 작동하도록 오버로드 된 함수에 별칭을 만들 수있는 방법이 없으므로 원하는 정확한 함수 오버로드를 항상 지정해야합니다.

  • C ++ 14를 사용하면 constexpr템플릿 변수 로 훨씬 더 나아갈 수 있습니다 . 이를 통해 템플릿 함수의 별칭을 지정할 수 있습니다.

    template<typename T>
    constexpr void old_function(/* args */);
    
    template<typename T>
    constexpr auto alias_to_old = old_function<T>;
    
  • 또한 C ++ 11부터 std::mem_fn멤버 함수의 별칭을 지정할 수 있는 함수가 호출되었습니다 . 다음 예를 참조하십시오.

    struct A {
       void f(int i) {
          std::cout << "Argument: " << i << '\n';
       }
    };
    
    
    A a;
    
    auto greet = std::mem_fn(&A::f); // alias to member function
    // prints "Argument: 5"
    greet(a, 5); // you should provide an object each time you use this alias
    
    // if you want to bind an object permanently use `std::bind`
    greet_a = std::bind(greet, a, std::placeholders::_1);
    greet_a(3); // equivalent to greet(a, 3) => a.f(3);
    

함수 포인터 또는 함수 참조를 만들 수 있습니다.

void fn()
{
}

//...

void (*p)() = fn;//function pointer
void (&r)() = fn;//function reference

typedef int (*printf_alias)(const char*, ...);
printf_alias holler = std::printf;

잘해야합니다.


int (*holler)(const char*, ...) = std::printf;


인라인 래퍼를 사용하십시오. 두 API를 모두 얻지 만 단일 구현을 유지합니다.


가입일 fluentcpp : ALIAS_TEMPLATE_FUNCTION의 (f, g)

#define ALIAS_TEMPLATE_FUNCTION(highLevelF, lowLevelF) \
template<typename... Args> \
inline auto highLevelF(Args&&... args) -> decltype(lowLevelF(std::forward<Args>(args)...)) \
{ \
    return lowLevelF(std::forward<Args>(args)...); \
}

여기서 IMO를 언급 할 가치가 있습니다. 원래 질문 (및 훌륭한 답변)은 함수의 이름을 바꾸고 싶을 때 확실히 유용하지만 (그럴만 한 이유가 있습니다!), 원하는 모든 것이 깊은 네임 스페이스를 제거하는 것입니다. 이름을 유지하십시오. 이에 대한 using키워드가 있습니다.

namespace deep {
  namespace naming {
    namespace convention {
      void myFunction(int a, char b) {}
    }
  }
}
int main(void){
  // A pain to write it all out every time
  deep::naming::convention::myFunction(5, 'c');

  // Using keyword can be done this way
  using deep::naming::convention::myFunction;
  myFunction(5, 'c');  // Same as above
}

This also has the advantage of it being confined to a scope, though you could always use it at the top level of a file. I often use this for cout and endl so I don't need to bring in ALL of std with the classic using namespace std; at the top of a file, but also useful if you're using something like std::this_thread::sleep_for() a lot in one file or function, but not everywhere, and not any other functions from the namespace. As always, it's discouraged to use it in .h files, or you'll pollute the global namespace.

This is not the same as the "renaming" above, but is often what is really wanted.

참고URL : https://stackoverflow.com/questions/3053561/how-do-i-assign-an-alias-to-a-function-name-in-c

반응형