簡體   English   中英

在c ++模板元編程中檢測void方法

[英]Detecting void method in c++ template metaprogramming

我正在嘗試編寫模板元函數來檢測類型是否具有void類型的成員函數。

目前我能夠使用SFINAE來檢測成員函數是否具有明確的類型,例如double,int等

 template<typename C> static auto Test(void*) -> decltype(int{std::declval<C>().foo()}, Yes{});

當然我可以反轉它(如附帶的代碼片段所示)來測試它不是int,但我無法弄清楚如何測試它是無效的。

下面的代碼片段目前輸出

A  does not have void foo
B  has void foo
C  has void foo

但是,C的foo()方法具有double類型,因此這是不正確的輸出。 如何調整它以正確檢查void foo()

#include <iostream>
#include <memory>

class A {
public:
    int foo() {
        return 0;
    }
};

class B {
public:
    void foo() {
    }
};

class C {
public:
    double foo() {
        return 0;
    }
};

template <typename T>
class has_void_foo {
private:
  typedef char Yes;
  typedef Yes No[2];

  template<typename C> static auto Test(void*) -> decltype(int{std::declval<C>().foo()}, Yes{});
  template<typename> static No& Test(...);

public:
    static bool const value = sizeof(Test<T>(0)) != sizeof(Yes);
};

int main(void) {
    std::cout << "A ";
    if (has_void_foo<A>::value) {
        std::cout << " has void foo";
    } else {
        std::cout << " does not have void foo";
    }
    std::cout << std::endl << "B ";
    if (has_void_foo<B>::value) {
        std::cout << " has void foo";
    } else {
        std::cout << " does not have void foo";
    }
    std::cout << std::endl << "C ";
    if (has_void_foo<C>::value) {
        std::cout << " has void foo";
    } else {
        std::cout << " does not have void foo";
    }
    std::cout << std::endl;

    return 0;
}

它遵循基於constexpr函數的可能解決方案:

#include <type_traits>

struct A {
    int foo() {
        return 0;
    }
};

struct B {
    void foo() {
    }
};

struct C {
    double foo() {
        return 0;
    }
};

template<typename T, typename R, typename... Args>
constexpr bool has_void_foo(R(T::*)(Args...)) { return std::is_void<R>::value; }

int main() {
    static_assert(not has_void_foo(&A::foo), "!");
    static_assert(has_void_foo(&B::foo), "!");
    static_assert(not has_void_foo(&C::foo), "!");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM